feat(tracker): Gantt — #7 tier-4 (mobile, tree-view, predecessor column, visual deps, shift notify)#10859
Draft
MichaelUray wants to merge 285 commits into
Draft
feat(tracker): Gantt — #7 tier-4 (mobile, tree-view, predecessor column, visual deps, shift notify)#10859MichaelUray wants to merge 285 commits into
MichaelUray wants to merge 285 commits into
Conversation
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>
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>
…ize overlay Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
…ttView 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>
…ocus) Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
…both dates Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
The drag-controller reducer only accepted mousedown-bar from hover-bar state, but no DOM event ever transitioned idle → hover-bar (we never wired the mouseenter-bar event from GanttBar to the reducer). The hover state was dead code, and the first mousedown on a freshly-rendered bar was silently dropped — Playwright integration test surfaced this. Fix: reduceFromIdle accepts mousedown-bar directly with the same edge-discriminator logic as reduceFromHover. Real users always go through hover-bar first (mouseenter fires before mousedown), but synthetic event dispatch and re-render edge cases can skip it. Adds 2 tests: - mousedown-bar from idle → dragging-body - mousedown-bar (edge=left) from idle → resizing-left Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
…sion 1. Context menu is too tall (~19 entries from auto-resolved Huly actions). Restructured via includedActions allow-list to 9 curated entries that make sense for a Gantt bar: - Open (Edit issue) - Status / Priority / Assignee (existing actionPopup submenus, ›) - Set start date / Set due date - Copy issue ID / URL - Duplicate / Delete Component, Milestone, Labels, SubIssue, SetParent, Relations, Move-to-project and time-report stay accessible from the standard List/Kanban menu but are hidden from Gantt's right-click. 2. Unscheduled-drag-grip in the sidebar shared pointerdown with the canvas pan handler. Pan would start before the grip's mousedown|stopPropagation fired, swallowing the drag. Extended onCanvasPanStart exclusion: now also bails on .sidebar-cell, .drag-grip, .resize-handle. The grip's pointerdown no longer triggers a stray pan. Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
…Sub-Issue User UX feedback 2026-05-11: the allow-list approach hid Open (Edit issue) because tracker registers a custom Open action for tracker.class.Issue with an auto-generated ID, and it also hid Set parent issue / Add sub-issue which the user explicitly needs to manage issue hierarchy from the Gantt. Switch from includedActions to excludedActions. Hide only the genuinely noisy entries for a Gantt right-click: Component, Milestone, Labels, CopyIssueTitle, Relations, NewRelatedIssue, EditRelatedTargets, MoveToProject, CopyAsMarkdownTable, UnsetParent. Result: Open / Status / Priority / Assignee / Set start date / Set due date / Add sub-issue / Set parent issue / Copy ID / Copy URL / Duplicate / Delete remain — 12 entries instead of 18, with the expandable submenus (Status, Priority, Assignee ›) keeping the visible menu compact. Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
…pra labels
User requirements 2026-05-11:
1. Restructure Gantt right-click menu: "Sub-issue & Parent" as a single
collapsed Hierarchy ▸ submenu containing
- Set parent issue…
- Add sub-issue
- Link existing as sub-issue… (NEW)
The old flat SetParent + NewSubIssue entries are hidden from the
parent menu (excludedActions) so the Gantt context menu stays compact.
2. EditIssue panel: add a "Set parent issue…" button visible when the
issue has no parent — previously this was only reachable via right-
click context menu, not from the open issue itself.
3. SubIssues panel: add a "Link existing as sub-issue" button next to
the existing "Add sub-issue" button so the user can attach an
already-existing issue without first opening it.
4. GanttHeader two-row labels (user feedback: "year/month above"):
- day view: month name above day number
- week view: year above Wnn
- month view: year above month name (was entirely missing)
- quarter view: year split out above Q1/Q2/… (was side-by-side
"Q1 2026" — visually noisy at dense zoom)
Supra-label renders only at segment boundaries (1st of month, first
week of year, January, Q1) so it doesn't repeat in every column.
3 new jest tests cover day/week/quarter supra cases.
- Hierarchy UiAction missing required `action` field — added no-op
(Menu.svelte routes the click via `component:` when present).
- dragging-unscheduled no longer shifts existing descendants — the
synthetic "today" origin would have shifted them by a wildly
unrelated delta. Unscheduled-drag now only commits the parent.
- LinkSubIssueActionPopup: full ancestor + transitive descendant
ignore set so the picker can't create cycles (BFS over the
parents[0].parentId edge, matching scheduler.descendantsWithDates).
- releasePointerCapture now guarded by hasPointerCapture(pointerId)
to avoid InvalidStateError when a pointerup bubbles from an
excluded child (resize-handle, drag-grip).
- openSetStartDate (context menu) now surfaces commit failures via
NotificationSeverity.Error, matching commitDrag's error handling.
- i18n: drag-grip tooltip and duration tooltip pulled out of hardcoded
English into tracker.string.GanttDragToSchedule + GanttDurationTooltip.
New files:
- plugins/tracker-resources/src/components/LinkSubIssueActionPopup.svelte
- plugins/tracker-resources/src/components/gantt/GanttHierarchySubmenu.svelte
i18n: 5 new keys (Hierarchy, LinkExistingSubIssue, SetParentIssueLabel,
GanttDragToSchedule, GanttDurationTooltip).
Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
…mmary-bar interactivity
User UX requirements 2026-05-11:
1. Click-to-select gate: a bar must be clicked once to become "selected"
(solid blue outline, .bar.selected) before the next mousedown
actually starts a drag/resize. Prevents accidentally dragging an
issue while panning the canvas horizontally — earlier feedback was
that fast horizontal pans would catch a bar by mistake. Plane-style
UX. Clicking the canvas background clears the selection.
2. Confirmation popup before commit: GanttConfirmCommitPopup shows a
"Move X to Y – Z?" / "Change X to Y – Z?" dialog with Cancel/Apply
buttons. Two independent ViewOption toggles (Customize-View → Display)
gate whether the popup appears:
- ganttConfirmMove (default-on) — drag-body
- ganttConfirmResize (default-on) — resize-left/right
Saves to the same per-viewlet option store as ganttShowStatus, so
each user gets their own preference. Skip the popup entirely when
the preview is unchanged (zero-delta drag).
sub-issues it renders as the MS-Project claw rather than a regular
rect. Previously the claw had no mousedown/contextmenu, so commitDrag's
parent-pulls-children path was unreachable from the UI. A transparent
`summary-hit` rect now spans the claw and wires the standard
onBarDown / onBarContextMenu handlers, plus the two resize-handles.
Milestone summaries (issueObj === undefined) stay read-only.
- Split GanttConfirm{Move,Resize} setting label from dialog title.
New keys: GanttConfirmMoveTitle = "Move issue?", GanttConfirmResizeTitle
= "Change issue dates?". Setting labels remain "Confirm before moving an
issue" etc.
- Drop unused GanttClickToSelect string.
- New jest suite `link-sub-issue-cycle.test.ts` (6 tests) fences the
ancestor/descendant/self/cycle ignore logic so future refactors can't
silently regress cycle protection.
Deploy:
- models/tracker + models/all rebuilt to ship the new ViewOption keys.
- front/transactor/workspace/tool images at gantt-v35.
- Workspace upgrade applied to all 3 dk3 workspaces — toggles appear in
Customize-View → Display.
Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
…et + a11y roles
per explicit user preference for both select-first + confirm-popup
default-on):
1. Parent-drag now shifts the FULL descendant tree, not just children
that happen to be in the view's filtered `issues` array. Previously
a Tracker filter that hid some sub-issues caused them to stay at
the old date while their parent moved — silent tree drift. commitDrag
and shiftFocused both now run `client.findAll(tracker.class.Issue,
{ space: issue.space })` to query the full space before walking
descendantsWithDates. One extra query per commit, no impact on drag-
interactive frame rate.
2. computeCanvasX (unscheduled drag) now offsets by sidebarWidthPx +
5 px instead of just sidebarWidthPx. The 5 px is the resize-cell
column between sidebar and canvas (.resize-cell). The hscrollbar
has always used this offset (style="padding-left: {sidebarWidthPx +
5}px"); unscheduled-drag was the only consumer that missed it,
causing drops to land a few pixels off at high zoom.
3. A11y: the 6 interactive <rect>s on GanttBar (regular + summary +
resize handles, both branches) now carry role="button",
tabindex="-1", and aria-label so screen readers announce them as
actionable. The a11y-click-events-have-key-events warning is
suppressed per-rect with svelte-ignore plus a banner comment
explaining that keyboard support lives at the GanttView level
(Tab/ArrowLeft/Right). 94 → 88 warnings.
Tests: 5 suites / 60 passed.
Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
…bels
friction observation about select-first + confirm-popup left as-is
per explicit user preference, the parent-drag performance note is a
future-large-space concern):
1. .settings-btn / .settings-popover removed from GanttView.svelte.
They were leftover from an earlier custom-popover prototype that
was replaced by Huly's standard ToggleViewOption pattern in PR2;
the CSS was orphaned. Drops 4 svelte-check warnings.
2. Resize handle ARIA labels were hardcoded English ("Resize start" /
"Resize end"). Now translated via tracker.string.GanttAriaResizeStart
and GanttAriaResizeEnd. Translation resolves async on themeStore
language change; falls back to the English default until resolved.
84 warnings (was 88).
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>
…marked invariant - cursor: pointer when editable+unselected, grab when selected, grabbing during active drag (same state machine for summary claw) - .bar.selected: 3px stroke + stronger glow, paint-order stroke fill so the armed state is unmistakable on every status fill color - .bar.focused: 1px dashed (was 2px solid) — visually distinct from .selected so the two states never look identical - handleBarMouseDown syncs focusedIssueId to selectedIssueId on first-click and onBackgroundClick clears both; eliminates the 'multiple bars marked' visual where Tab-focus + click-select highlighted two bars simultaneously - resize handles only render when the bar is selected (avoids accidental edge-grabs on unarmed bars; minimal surface for the ew-resize cursor) User feedback 2026-05-11 from dk3 deployment: single click did not visibly mark the bar and multiple bars appeared selected at once. Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
…te, sidebar-virtualization) 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>
…ed by localStorage Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
Adds an opt-in 'Predecessors' column to the Tracker issue list, so
power users can see dependency relationships without switching to the
Gantt view. Spec
docs/superpowers/specs/2026-05-14-huly-gantt-predecessor-column-design.md.
Rendering (spec-mandated):
- Identifier + Kind + Lag notation, e.g. 'PROJ-3 FS+2d'.
- Zero lag drops the +0d suffix ('PROJ-3 FS').
- Multiple predecessors collapse to 'first +N more' with a hover
tooltip listing every upstream issue.
- Click on the identifier navigates to the predecessor issue via
DocNavLink -> EditIssue (standard Tracker navigation).
- Empty cell when the issue has no incoming relations.
Files:
- plugins/tracker-resources/src/components/issues/
PredecessorsColumnPresenter.svelte -- live-query relation + sources
PredecessorsTooltip.svelte -- +N more hover body
- plugins/tracker-resources/src/plugin.ts -- PredecessorsColumn component id
- plugins/tracker-resources/src/index.ts -- register component
- models/tracker/src/viewlets.ts -- column entry (optional, hidden by default)
i18n strings 'Predecessors'/'Vorgaenger' already exist in en+de from
the Gantt sidebar column work, no new strings needed.
Tests: 518 -> 531 (13 helper tests added in previous commit).
svelte-check: 0 errors on new components.
Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
…uping by recipient Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
…dle rendering Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
…yChangeKind for Visual DependencyEditor Adds tooltip strings (one per kind) plus the picker aria-label and the 'Change type' link label in EN + DE. Keys match existing convention. Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
…m picker Replaces the dropdown in DependencyEditor with a 2x2 grid of clickable SVG mini-diagrams (FS / SS / FF / SF). After a pick the grid collapses to a compact single-diagram view plus an inline -14..+14d lag slider and a 'Change type' link that re-expands the grid. The existing NumberInput stays as fallback for values outside the slider range (-30..+90 storage clamp unchanged). Per spec 2026-05-14-huly-gantt-visual-dependency-editor-design.md: - 2x2 layout (FS/SS top, FF/SF bottom) - lag slider embedded in the picked diagram view - collapse-after-pick UX with re-expand button - role=radio + arrow-key keyboard navigation between diagrams - aria-label + title tooltips with full kind-hint i18n strings Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
…d notification type Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
Adds pure-TS helpers for the upcoming 2x2-grid mini-diagram picker: - DIAGRAM_KINDS in spec-mandated grid order (FS/SS/FF/SF) - diagramGridIndex() for keyboard navigation (Arrow keys) - clampLagSlider() for the inline -14..+14d slider - getDiagramSvgPaths() returns rects + arrow polyline per kind, with FS/FF distinguishable by arrow endpoint (left vs right of S) 18 new tests, 549 total. Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
…fset
Two small follow-ups discovered during the final pass:
- GanttBar .bar gets touch-action: none so iOS Safari does not
hijack pointerdown on a bar with native pan-zoom (Spec §"iOS-
Safari Edge-Cases"). Without this the long-press timer never
fires because Safari steals the gesture before pointerup.
- The drawer's top offset was hardcoded to 32 px via a non-existent
--gantt-header-height variable. HEADER_HEIGHT is 56 in
GanttView.svelte; the drawer now matches, with a comment to keep
it in sync. height: calc(100% - 56px) so the drawer doesn't
overflow under the bottom of the canvas-cell either.
Tests: 631 / 631. svelte-check: 0 errors.
Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
Phone-mode (≤640 px) gets:
- Hamburger button in the toolbar that toggles a slide-out drawer
overlay carrying the issue list (Spec §"Phone": Sidebar Phone =
Slide-out-Drawer auf Tap).
- Sidebar-cell goes absolute + translateX(-100%) by default; the
.drawer-open class slides it to 0. Tap-anywhere-on-canvas
backdrop dismisses it; the onJump handler also closes it once
the user has scrolled to the picked row (Spec §"Phone": Tap
schließt Drawer).
- Resize-corner / resize-cell are hidden — finger-width column
resize is fiddly and the drawer covers the viewport anyway.
Tablet-mode (641–1024 px) gets:
- .nav-btn / .gantt-toolbar-icon-btn / .zoom-btn min-44x44 px hit
targets so touch-tap is reliable (Spec §"Tablet": Hit-Targets
min 44x44 px).
Confirm popups become responsive (Spec §"Risks": 600 px popups
overflow 320 px screens): max-width: min(480px, 95vw) + box-sizing
border-box. On Phone the popup is read-only so this is belt-and-
braces, but the cap also helps narrow-window desktop users.
i18n strings (EN + DE) added for hamburger aria-label and the
read-only hint. Tests: 631 / 631. svelte-check: 0 errors.
Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
Close the coverage gap surfaced by the 2026-05-15 regression audit: - cascade-token.ts: 9 tests covering default + custom prefix, the <date>-<counter> suffix shape, monotonic counter increment and 1000-call uniqueness. - dependency-shift-send.ts: 5 tests around early-return paths (empty primaries+shifts, empty bundle, missing PersonSpace) and the onError / silent-swallow contract. The Tx-create bundle remains untested by design (pure IO glue with no behaviour to assert). - menu-actions.ts: 14 tests covering the ganttExtraActions array shape (group, icon, component, props) plus the openSetStartDate popup wiring and the four callback branches (dismiss, clear, auto-fill-due, no-auto-fill). exporter.ts stays untested: every export is bound to the DOM / canvas / html2canvas / jsPDF and cannot run under the node Jest env without either refactoring or pulling in jsdom. Audit report appended with the rationale. 645 -> 673 tests. 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>
Lift the gantt-toolbar controls (Group-by, Date-Nav, Zoom preset + days input, Undo/Redo, Hamburger, Fullscreen) out of GanttView and into the SpaceHeader's row 2 so the user sees a single unified toolbar instead of three stacked strips. Render order matches the spec: Filter -> Group-by -> Lupe -> Date-Nav -> Week -> days -> Undo/Redo -> All/Active/Backlog -> Hamburger -> Fullscreen (Hamburger now before Fullscreen, swapped from legacy). State bridges across the parent/child boundary via a writable Svelte store (ganttToolbarSnapshot): GanttView keeps owning the values and handlers, writes a snapshot on every reactive update, and clears it on destroy. A standalone GanttToolbarBar component subscribes to the store and renders the controls in two clusters, one per slot. SpaceHeader gains: - overrideSearch prop + search slot to let consumers replace the built-in SearchInput + FilterButton when needed - extra-trailing slot rendered after the ModeSelector Non-gantt viewlets (List, Kanban) keep the SpaceHeader default exactly as before. Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
The SpaceHeader's row-2 search cluster uses flex-direction: row-reverse, so markup order is reversed from visual L→R. Split GanttToolbarBar's search section into search-mid (Group-by only) and search-end (the rest) and reverse the internal markup order so the user sees: Filter → Group-by → Lupe → Date-Nav → Week → days → Undo/Redo The extra cluster keeps row direction so the trailing section's Hamburger-before-Fullscreen markup matches the visual order. Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
…s in extended sidebar - Move the Fullscreen toggle out of the gantt-toolbar trailing slot into the global status bar (packages/ui Root.svelte, next to the gear icon) so it's reachable from every viewlet, not only Gantt. The button switches Maximize/Minimize icon based on document.fullscreenState. - Swap the search-row ordering so the Lupe (SearchInput) sits leftmost and Filter sits next to it: visual L→R is now Lupe → Filter → Group-by → Date-Nav → Week → days → Undo/Redo. - Restore milestone labels (and start/due dates) in the extended-columns sidebar. The Phase-3a renderer fell through to an empty placeholder for any non-issue row; the user reported milestone text vanished as soon as Extended Sidebar Columns was enabled. Now the title column shows the milestone label (italic, matching the legacy compact sidebar), and the startDate/dueDate/deadline columns show the milestone's startDate/targetDate. Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
This was referenced May 18, 2026
Draft
Open
|
Connected to Huly®: UBERF-16449 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Final tier-4 batch covering five mostly-independent features:
localStorage; chevron-icon glyphs (from PR4 polish) drive the visual.2×2mini-diagram picker for switching FS / SS / FF / SF on existing dependencies, with theDependencyKindHint*i18n family.Also lifts the Gantt toolbar into SpaceHeader row 2 (so it lives in the same toolbar surface as the other viewlets) and adds a global Fullscreen toggle.
What's in this PR (+17 incremental commits)
Mobile / touch
touch-action: noneon bars + drawer header offsetTree view
localStoragePredecessors column
feat(tracker)Predecessors column in Tracker list viewVisual DependencyEditor
diagram-helpersfor Visual DependencyEditorDependencyEditorwith 2×2 mini-diagram pickerDependencyKindHint*,DependencyPickKind,DependencyChangeKindShift notifications
feat(models/tracker)registerDependencyShiftedNotificationclass + notification typeDependencyShiftedPresenterfor inbox bundle renderingDependencyShiftednotification strings (en + de)docs(gantt)clarify cascade-token JSDoc with v1 dependency-shift wiringToolbar hoist & fullscreen
SpaceHeaderrow 2Coverage
testcover three previously-untested Gantt lib filesStack overview
…pr1-schema…pr2-readonly…pr3a-edit…pr3b-deps-cascade-cp…pr4-polish…pr5-tier2…pr6-tier3-virtualization…pr7-tier4MichaelUray:feat/gantt-sectionMarked as draft to signal stack dependency on PR1 → PR6.
How to review
→ Fork compare: PR6...PR7 — 17 commits, 31 files
The five features touch different files and can be reviewed mostly independently. Largest single addition is the cascade-shift bundle aggregator + presenter for the notification path.
Testing
DCO
All commits are
Signed-off-by.