Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
272 commits
Select commit Hold shift + click to select a range
c5a65dc
feat(tracker-resources): blue plus-only NewIssueHeader
MichaelUray May 15, 2026
44b8797
fix(tracker-resources): resize handle no longer fights canvas pan
MichaelUray May 15, 2026
b2582fc
feat(tracker-resources): sticky-bottom horizontal scrollbar (Plane-st…
MichaelUray May 15, 2026
f1cd1a2
feat(tracker-resources): custom DOM scrollbar thumb (visible everywhere)
MichaelUray May 15, 2026
3d5ea84
feat(tracker-resources): hardened scrollbars + status colors + tight …
MichaelUray May 15, 2026
3bd0761
feat(tracker-resources): status badge column + ganttShowStatus toggle
MichaelUray May 15, 2026
fa36024
feat(tracker-resources): Tracker UI redesign polish v27
MichaelUray May 15, 2026
619b9a2
feat(tracker-resources): inline-add row in Gantt sidebar (PR2.1)
MichaelUray May 15, 2026
61c8df3
feat(model-tracker): register startDate + dueDate as Issue filters
MichaelUray May 15, 2026
27f29b5
fix(tracker-resources): hide Gantt h-scrollbar when there's no overflow
MichaelUray May 15, 2026
0911bb0
chore(tracker-resources): remove internal review markers from inline …
MichaelUray May 15, 2026
614929d
fix(tracker-resources): resolve eslint errors in gantt read-only comp…
MichaelUray Jul 3, 2026
6760882
chore(tracker-resources): apply prettier formatting after develop merge
MichaelUray Jul 3, 2026
08edbc5
feat(tracker-resources): Gantt drag/resize state types
MichaelUray May 15, 2026
3b41142
feat(tracker-resources): drag-controller reducer skeleton + idle tran…
MichaelUray May 15, 2026
5f363ef
feat(tracker-resources): drag-controller — body drag transitions
MichaelUray May 15, 2026
1a84628
feat(tracker-resources): drag-controller — resize-left/right with cla…
MichaelUray May 15, 2026
cd3100b
feat(tracker-resources): scheduler.descendantsWithDates (cycle-safe BFS)
MichaelUray May 15, 2026
456157f
feat(tracker): i18n keys for Gantt edit-mode (set-start-date + 5 toas…
MichaelUray May 15, 2026
ad50211
feat(tracker-resources): local Set-start-date action for Gantt menu
MichaelUray May 15, 2026
7fcdd8d
feat(tracker-resources): GanttView activeDrag store + per-issue edit …
MichaelUray May 15, 2026
9d7ae72
feat(tracker-resources): GanttBar edge-detect + resize-handle hit areas
MichaelUray May 15, 2026
e70801a
feat(tracker-resources): GanttCanvas forwards bar events + mounts res…
MichaelUray May 15, 2026
631accc
feat(tracker-resources): wire drag reducer + atomic commitDrag in Gan…
MichaelUray May 15, 2026
7ea1282
feat(tracker-resources): active-drag preview geometry + tint on GanttBar
MichaelUray May 15, 2026
0eba227
feat(tracker-resources): right-click context menu on bar + sidebar row
MichaelUray May 15, 2026
18e0ac2
feat(tracker-resources): keyboard Tab cycle + arrow-shift for Gantt bars
MichaelUray May 15, 2026
9b8e3da
feat(tracker-resources): dim non-active rows during drag (spotlight f…
MichaelUray May 15, 2026
f82c534
feat(tracker-resources): drag-from-unscheduled — drop on canvas sets …
MichaelUray May 15, 2026
c4fd5b0
fix(tracker-resources): allow direct idle → drag in reducer
MichaelUray May 15, 2026
a79ef05
feat(tracker-resources): slim Gantt context menu + fix pan-grip colli…
MichaelUray May 15, 2026
5887db0
fix(tracker-resources): Gantt menu — deny-list + restore Open/Parent/…
MichaelUray May 15, 2026
778c31f
feat(tracker): Gantt Hierarchy submenu + EditIssue parent + header su…
MichaelUray May 15, 2026
e0d9db0
feat(tracker-resources): Gantt select-first drag + confirm popup + su…
MichaelUray May 15, 2026
59097e9
fix(tracker-resources): Gantt parent-drag truth source + canvasX offs…
MichaelUray May 15, 2026
ba40985
chore(tracker-resources): Gantt polish — drop stale CSS, i18n ARIA la…
MichaelUray May 15, 2026
9c93a08
chore(tracker-resources): remove internal review markers from inline …
MichaelUray May 15, 2026
b64ac3b
fix(tracker-resources): resolve eslint errors in gantt edit components
MichaelUray Jul 3, 2026
69f295f
chore(tracker-resources): apply prettier formatting after develop merge
MichaelUray Jul 3, 2026
4e1b0f9
i18n(tracker-assets): sync ru.json keys with en.json (gantt pr3a)
MichaelUray Jul 3, 2026
1737b25
fix(tracker-resources): Gantt bar selection — cursor, visual, single-…
MichaelUray May 15, 2026
06cfec0
fix(tracker-resources): Gantt bar selection — reactive prop helpers
MichaelUray May 15, 2026
39ece57
feat(tracker-resources): Gantt sidebar — milestone single-click opens…
MichaelUray May 15, 2026
18a9c5f
fix(tracker-resources): Gantt openMilestone resolves full Milestone b…
MichaelUray May 15, 2026
9eec054
feat(tracker-resources): Gantt PR3.3 — milestone bars editable with c…
MichaelUray May 15, 2026
a6dffdf
feat(tracker-resources): Gantt pan from unselected bars
MichaelUray May 15, 2026
ea1da5e
feat(tracker): add 13 i18n keys for Gantt dependencies (PR4a)
MichaelUray May 15, 2026
c2d56c5
feat(model-tracker): add ganttShowPredecessors ViewOption (PR4a)
MichaelUray May 15, 2026
b4eba40
feat(tracker-resources): predecessor-format helpers (PR4a)
MichaelUray May 15, 2026
6149ff8
feat(tracker-resources): scheduler.wouldCreateCycle (PR4a)
MichaelUray May 15, 2026
a5c030b
feat(tracker-resources): dependency-router endpoints (PR4a)
MichaelUray May 15, 2026
8f86e87
feat(tracker-resources): dependency-router bezier + arrowhead (PR4a)
MichaelUray May 15, 2026
437d1b4
feat(tracker-resources): dependency-router connectedIssueIds (PR4a)
MichaelUray May 15, 2026
f5fe635
feat(tracker-resources): DragState + DragEvent connector variants (PR4a)
MichaelUray May 15, 2026
b4e5009
feat(tracker-resources): drag-controller connector state transitions …
MichaelUray May 15, 2026
2811809
fix(tracker-resources): drag-controller no stale target leak (PR4a)
MichaelUray May 15, 2026
33e7d48
feat(tracker-resources): GanttConnectorDot visual affordance (PR4a)
MichaelUray May 15, 2026
13977d9
feat(tracker-resources): GanttDependencyArrow bezier + lag pill (PR4a)
MichaelUray May 15, 2026
c50c141
feat(tracker-resources): GanttDependencyLayer overlay (PR4a)
MichaelUray May 15, 2026
5f05e90
feat(tracker-resources): DependencyEditor popup (PR4a)
MichaelUray May 15, 2026
a2a5a2c
fix(tracker-resources): GanttDependencyLayer use stroke-dasharray:0 n…
MichaelUray May 15, 2026
2abb02b
feat(tracker-resources): GanttBar hover state + connector dot mount (…
MichaelUray May 15, 2026
26e926e
fix(tracker-resources): GanttBar isMilestoneSummary use dragTarget (P…
MichaelUray May 15, 2026
12dc202
feat(tracker-resources): GanttCanvas mounts DependencyLayer + barRect…
MichaelUray May 15, 2026
ad90cd2
feat(tracker-resources): GanttSidebar predecessor column (PR4a)
MichaelUray May 15, 2026
38ce0c5
feat(tracker-resources): GanttView dependency wiring (PR4a)
MichaelUray May 15, 2026
f0a9502
fix(tracker): de-duplicate 13 PR4a i18n keys from base namespace
MichaelUray May 15, 2026
fbabcc5
fix(tracker-resources): guard relationQuery against empty visibleIssu…
MichaelUray May 15, 2026
e735e5e
fix(tracker-resources): drop $or relationQuery, filter client-side (P…
MichaelUray May 15, 2026
967fdb9
fix(tracker-resources): harden Gantt dependency init and bar clicks
MichaelUray May 15, 2026
11f4bb0
fix(tracker-resources): pan from Gantt bars on drag
MichaelUray May 15, 2026
64c9cef
fix(tracker-resources): restore selected Gantt bar editing
MichaelUray May 15, 2026
2e85237
fix(front): clean startup console noise
MichaelUray May 15, 2026
6c710c4
fix(notification-resources): return ArrayBuffer-backed push key
MichaelUray May 15, 2026
d056097
fix(tracker-resources): stabilize gantt viewport and connectors
MichaelUray May 15, 2026
f6fa3c4
feat(tracker-resources): adaptive Gantt time-scale + optimistic depen…
MichaelUray May 15, 2026
5634091
fix(tracker-resources): inline gantt live-bezier reactive deps
MichaelUray May 15, 2026
dbee073
feat(tracker-resources): PR4b cascade simulation types
MichaelUray May 15, 2026
00c1183
feat(tracker-resources): PR4b detectCycle DFS helper
MichaelUray May 15, 2026
87b898b
feat(tracker-resources): PR4b addScheduleDays Phase-2 hook
MichaelUray May 15, 2026
cf439bd
fix(tracker-resources): PR4b test file license header + drop dead DAY…
MichaelUray May 15, 2026
44cc8b6
feat(tracker-resources): PR4b simulateCascade FS push + no-cascade
MichaelUray May 15, 2026
6f917cf
feat(tracker-resources): PR4b cascade SS/FF/SF anchor model
MichaelUray May 15, 2026
06d2e70
feat(tracker-resources): PR4b cascade pull-predecessor
MichaelUray May 15, 2026
d3f93f4
feat(tracker-resources): PR4b cascade parent-drag + merge tests
MichaelUray May 15, 2026
d2f3ccd
feat(tracker-resources): PR4b cascade chain + iteration-overflow tests
MichaelUray May 15, 2026
a6f4e21
feat(tracker-resources): PR4b cascade cycle bailout test
MichaelUray May 15, 2026
0b17bd0
feat(tracker-resources): PR4b cascade permission-denied test
MichaelUray May 15, 2026
df6d72d
feat(tracker-resources): PR4b cascade hidden-issue scope test
MichaelUray May 15, 2026
32bb53b
feat(tracker-resources): PR4b cascade i18n keys (en)
MichaelUray May 15, 2026
e29db68
feat(tracker-resources): PR4b ConfirmCascadePopup mini-timeline
MichaelUray May 15, 2026
c03421f
docs(tracker-resources): PR4b scheduler comment polish
MichaelUray May 15, 2026
69609c9
feat(tracker-resources): PR4b commitWithCascade body-drag wiring + si…
MichaelUray May 15, 2026
d25cd9a
fix(tracker-resources): PR4b keep drag preview alive while cascade po…
MichaelUray May 15, 2026
c4381c8
feat(tracker-resources): show Gantt IssueRelations in issue editor
MichaelUray May 15, 2026
c030509
fix(tracker-resources): always show Dependencies section + ganttDebug…
MichaelUray May 15, 2026
c24582e
feat(tracker-resources): PR4b popup polish + legacy confirm parity
MichaelUray May 15, 2026
62cca12
fix(tracker-resources): PR4b svelte-check + type-narrowing fixes
MichaelUray May 15, 2026
8f2d0fa
fix(tracker-resources): PR4b permission check before no-cascade return
MichaelUray May 15, 2026
6484c10
feat(tracker-resources): PR5 critical-path types
MichaelUray May 15, 2026
b4a4574
feat(tracker-resources): PR5 critical-path scaffold + cycle bailout
MichaelUray May 15, 2026
1ccb5b5
feat(tracker-resources): PR5 i18n keys (en)
MichaelUray May 15, 2026
d6363f4
feat(tracker): PR5 ganttCriticalPath + ganttSlackColumn view options
MichaelUray May 15, 2026
67dc0fd
feat(tracker-resources): PR5 critical-path UI wiring
MichaelUray May 15, 2026
5a0a838
feat(tracker-resources): PR6 export + keyboard shortcuts + DE i18n
MichaelUray May 15, 2026
0651c50
fix(tracker-resources): PR5 critical-path topoSort guard + destroy timer
MichaelUray May 15, 2026
b27ffe9
fix(tracker-resources): PR5 violated bars paint red
MichaelUray May 15, 2026
9bb5de9
fix(tracker-resources): connector dot above arrows + target drop indi…
MichaelUray May 15, 2026
18cf64e
feat(tracker): readable Dependencies panel + IssueRelation activity p…
MichaelUray May 15, 2026
6f379db
refactor(tracker-resources): collapse connector-drag to a single even…
MichaelUray May 15, 2026
2abb7d8
refactor(tracker-resources): drop canvas-level connector delegation
MichaelUray May 15, 2026
ecb338f
fix(tracker-resources): deps panel — drop ignore, default to Issues t…
MichaelUray May 15, 2026
dfc91d9
fix(tracker): scope dependency picker to current project
MichaelUray May 15, 2026
23b0e86
fix(tracker): dependency picker — wrap ObjectPopup so items render
MichaelUray May 15, 2026
69de79a
feat(tracker): label LinkExistingSubIssue button + DE translation
MichaelUray May 15, 2026
2beed04
feat(tracker): unified hierarchy add chooser + resizable pickers
MichaelUray May 15, 2026
db0d1bb
feat(tracker): dependency direction chooser — predecessor + successor
MichaelUray May 15, 2026
ee5ecee
fix(tracker): cycle check uses project-wide relations + neutralize re…
MichaelUray May 15, 2026
45d3240
fix(tracker-resources): confirm dialog before dependency removal
MichaelUray May 15, 2026
b04935b
fix(love-resources): handle nullish content-type in strict-boolean check
MichaelUray Jul 3, 2026
9fe0b25
fix(tracker-resources): resolve eslint errors in gantt dependency/cas…
MichaelUray Jul 3, 2026
c80fcf2
chore(tracker-resources): apply prettier + eslint --fix formatting af…
MichaelUray Jul 3, 2026
022618b
fix(tracker-resources): repair GanttView imports and drop orphaned mo…
MichaelUray Jul 3, 2026
5628afb
test(sanity): adapt sub-issue page-objects to HierarchyAddPopup chooser
MichaelUray Jul 4, 2026
c9481fe
test(tracker): make buttonEstimation locator sibling-based, not posit…
MichaelUray Jul 4, 2026
2a865aa
chore(tracker): reconcile i18n + Gantt sources after develop rebase
MichaelUray Jul 9, 2026
6b59f56
fix(tracker-resources): align relationSatisfied with new anchor seman…
MichaelUray May 15, 2026
967735b
feat(tracker-resources): wire project workingDaysConfig into Gantt sc…
MichaelUray May 15, 2026
0f02b11
fix(tracker-resources)!: respect working-days in cascade scheduler, f…
MichaelUray May 15, 2026
ea35465
feat(tracker-resources): paint non-working-day tint in Gantt canvas
MichaelUray May 15, 2026
95ffbaf
feat(models/tracker): persist Project.workingDaysConfig + EN/DE strings
MichaelUray May 15, 2026
a3caff3
feat(tracker-resources): respect working-days in critical-path
MichaelUray May 15, 2026
98baa19
feat(tracker): add WorkingDaysConfig type + scheduler working-days he…
MichaelUray May 15, 2026
85bfefb
fix(tracker-resources): re-stamp virtualized sidebar row y from curre…
MichaelUray May 15, 2026
d3f6261
test(tracker-resources): cover groupRowsToLayoutRows adapter
MichaelUray May 15, 2026
0fb104a
fix(tracker-resources): pass IntlString to Button label in Scheduling…
MichaelUray May 15, 2026
fc0a34c
test(tracker-resources): tighten sidebar-sort fixture typing
MichaelUray May 15, 2026
2d066a6
feat(tracker-resources): add GanttSidebarHeaderCell + GanttSidebarCol…
MichaelUray May 15, 2026
65a7c41
feat(tracker-resources): tag cascade commits with cascadeToken for do…
MichaelUray May 15, 2026
6842801
feat(tracker-resources): add sidebar-columns pure helpers for Phase 3a
MichaelUray May 15, 2026
e5e9b78
feat(tracker-resources): wire Phase 3b filter-bar + group-by swimlanes
MichaelUray May 15, 2026
571171c
feat(tracker-resources): add group-by + filter pure helpers for Phase 3b
MichaelUray May 15, 2026
3bb9a19
feat(tracker-resources): filter manual issues from cascade + add casc…
MichaelUray May 15, 2026
76f8894
feat(tracker): add optional Issue.schedulingMode property + model dec…
MichaelUray May 15, 2026
9003726
feat(tracker-resources): add EN+DE i18n for off-viewport arrow indica…
MichaelUray May 15, 2026
3bf6924
feat(tracker-resources): show n-primaries hint in cascade confirm popup
MichaelUray May 15, 2026
282dc81
feat(tracker-assets): add EN+DE i18n for scheduling-mode toggle
MichaelUray May 15, 2026
3e70241
feat(tracker-resources): pipe schedulingMode through GanttCanvas to bars
MichaelUray May 15, 2026
991e2cc
feat(tracker-resources+models): wire Phase 3a extended sidebar grid
MichaelUray May 15, 2026
758995a
feat(tracker-resources): render bulk co-drag preview on selected gant…
MichaelUray May 15, 2026
7ba832e
feat(tracker-resources): style gantt tree breadcrumbs and depth guide…
MichaelUray May 15, 2026
f79ac4b
feat(tracker-resources): mount UndoManager + wire toolbar buttons + C…
MichaelUray May 15, 2026
5d188da
feat(tracker-resources): add scheduling-mode toggle to issue control …
MichaelUray May 15, 2026
181c2a4
feat(tracker-resources): render manual-schedule pin glyph in GanttBar
MichaelUray May 15, 2026
2a19d20
feat(tracker-resources): clip dep-arrows + add off-viewport row indic…
MichaelUray May 15, 2026
40d06e9
feat(models/tracker): register ganttGroupBy dropdown ViewOption
MichaelUray May 15, 2026
296fa03
feat(tracker-resources): add breadcrumb-aware filter and within-level…
MichaelUray May 15, 2026
41f2bf9
feat(tracker): i18n + IntlString refs for Phase 1 (Visual Polish)
MichaelUray May 15, 2026
d7c7bb4
feat(tracker-resources): add bar-label resolver
MichaelUray May 15, 2026
86d3b70
feat(tracker-resources): wire bar-label ViewOptions through GanttView…
MichaelUray May 15, 2026
36de63f
feat(tracker-resources): deadline-marker helpers + tests
MichaelUray May 15, 2026
98bb38f
feat(tracker-resources): three configurable bar-label slots in GanttBar
MichaelUray May 15, 2026
916f3ab
feat(tracker): add optional deadline field to Issue
MichaelUray May 15, 2026
9d4df73
feat(tracker-resources): add html2canvas + jspdf dependencies for Gan…
MichaelUray May 15, 2026
61c7595
feat(tracker-resources): keyboard shortcuts T/D/W/M/Q
MichaelUray May 15, 2026
d9be8cc
fix(tracker-resources): center Gantt nav, reorder PNG/PDF/Fullscreen,…
MichaelUray May 15, 2026
6cd60e8
feat(importer): support Gantt scheduling fields in HulyFormatImporter
MichaelUray May 15, 2026
fb501f6
feat(tracker): expose Issue.deadline on the public interface
MichaelUray May 15, 2026
94385d9
feat(tracker-resources): list Phase 1 keyboard shortcuts in GanttHelp…
MichaelUray May 15, 2026
4294799
feat(model-tracker): migrate IssueGantt viewOptions for existing work…
MichaelUray May 15, 2026
55614b3
fix(importer): use bare 'today+Nd' syntax for relative-date placeholders
MichaelUray May 15, 2026
92a0d9b
feat(tracker-resources): consolidate Gantt toolbar + add fullscreen +…
MichaelUray May 15, 2026
4d53bc2
feat(tracker-resources): deadline-marker render layer in GanttCanvas
MichaelUray May 15, 2026
bb90a30
feat(tracker-resources): export full Gantt (sidebar+bars) to PNG/PDF …
MichaelUray May 15, 2026
f7258a0
feat(tracker-resources): wire QuickInfoPopup to single-click bar (opt…
MichaelUray May 15, 2026
f0a466e
fix(tracker-resources): move Gantt toolbar to second header row + web…
MichaelUray May 15, 2026
7d0afa1
feat(tracker-resources): GanttQuickInfoPopup component
MichaelUray May 15, 2026
be5ca0e
chore(model-tracker): drop unused Viewlet type import from migration.ts
MichaelUray May 15, 2026
4ab4f38
fix(tracker-resources): disable 'Open Sub Issues' button when no sub-…
MichaelUray May 15, 2026
871e261
feat(tracker-resources): Deadline editor in Issue ControlPanel
MichaelUray May 15, 2026
ce0f72a
fix(tracker-resources): drop duplicate viewlet.IssueGantt declaration
MichaelUray May 15, 2026
34c0279
refactor(tracker-resources): drop gantt-toolbar Filter button, use Fi…
MichaelUray May 15, 2026
ec03931
fix(tracker-resources): label Gantt priority filter as Urgent/High/Me…
MichaelUray May 15, 2026
c0bec64
feat(tracker-resources): thread nameLookup map through group-by helpers
MichaelUray May 15, 2026
8f944b6
fix(tracker-resources): hide standard Customize View buttons in Gantt…
MichaelUray May 15, 2026
3093482
fix(tracker-resources): freeze Gantt drag preview while confirm popup…
MichaelUray May 15, 2026
da8d9ab
fix(models/tracker): declare viewlet.IssueGantt in model plugin
MichaelUray May 15, 2026
a4b7961
feat(tracker-resources): continuous Ctrl+Wheel zoom over gantt canvas
MichaelUray May 15, 2026
fe1320c
fix(tracker-resources): align Gantt extended sidebar grid width and s…
MichaelUray May 15, 2026
dd6cbc0
fix(tracker-resources): reserve body padding in cascade confirm popup
MichaelUray May 15, 2026
a367f5f
fix(tracker-resources): drop duplicate Phase-1 Gantt toolbar to unblo…
MichaelUray May 15, 2026
d2f424a
i18n(tracker): add relation activity strings (en + de)
MichaelUray May 15, 2026
762c197
feat(models/tracker): migrate legacy IssueRelation remove activity docs
MichaelUray May 15, 2026
5b0f71d
feat(tracker-resources): add mobile-friendly Gantt pure-logic helpers
MichaelUray May 15, 2026
0fa934a
fix(tracker-resources): widen row/col to number in diagramGridIndex
MichaelUray May 15, 2026
5b7ecbb
feat(tracker-resources): add RelationActivityPresenter for activity feed
MichaelUray May 15, 2026
3958a24
feat(tracker-resources): add relation-activity migration helpers
MichaelUray May 15, 2026
022c3d8
feat(tracker-resources): add predecessor-list-format helper
MichaelUray May 15, 2026
63ca20d
feat(tracker-resources): add GanttSaveViewPopup modal (name + fix-win…
MichaelUray May 15, 2026
d53aca9
feat(models/tracker): register IssueRelation add/remove/update activi…
MichaelUray May 15, 2026
7a6fe4a
fix(tracker-resources): use removeCollection for relation deletion so…
MichaelUray May 15, 2026
dd43280
feat(tracker-resources): wire layoutMode + pinch-zoom into GanttView
MichaelUray May 15, 2026
3ac1a9f
feat(tracker-resources): GanttBar pointer-only events + long-press ro…
MichaelUray May 15, 2026
787de99
fix(models/tracker): use trackerModel.viewlet.IssueGantt in migration
MichaelUray May 15, 2026
d4d08a7
fix(tracker-resources): wrap gantt toolbar on tablet viewports
MichaelUray May 15, 2026
ccbf2ae
fix(tracker-resources): data-driven PNG/PDF export with full sidebar …
MichaelUray May 15, 2026
807ecaf
fix(tracker-resources): replace gantt tree glyphs with ChevronRight/D…
MichaelUray May 15, 2026
8790f2a
fix(tracker-resources): add aria-label and title to gantt date-nav bu…
MichaelUray May 15, 2026
4d90790
fix(tracker-resources): resolve gantt aria-labels via translateCB
MichaelUray May 15, 2026
cc89671
feat(tracker-resources): add Estimation row to gantt quick-info popover
MichaelUray May 15, 2026
9260fff
fix(tracker-resources): add xmlns to gantt canvas svg root
MichaelUray May 15, 2026
e58674b
refactor(tracker-resources): replace hex colors in gantt with theme v…
MichaelUray May 15, 2026
da5aff9
fix(tracker-resources): keep both Customize-View + Configure-Columns …
MichaelUray May 15, 2026
65c40af
fix(tracker-resources): move Expand/Collapse-all to sidebar corner cell
MichaelUray May 15, 2026
6548ce4
fix(tracker-resources): defer scroll-driven translateX sync via rAF t…
MichaelUray May 15, 2026
ca93a83
fix(view+card-resources): apply ConfigureColumns tooltip to all Confi…
MichaelUray May 15, 2026
8a4222e
fix(tracker-resources): close GanttSaveViewPopup on X-click via onCancel
MichaelUray May 15, 2026
f979795
feat(tracker-resources): collapse 4 zoom-preset buttons into Dropdown…
MichaelUray May 15, 2026
ff1913f
refactor(view-resources): remove dead showViewOptions prop from Viewl…
MichaelUray May 15, 2026
04028d8
fix(view+tracker-resources): split Customize-View vs Configure-Column…
MichaelUray May 15, 2026
44658ef
fix(tracker-resources): replace gantt dblclick on mobile with quick-i…
MichaelUray May 15, 2026
d81fcfa
docs(tracker-resources): document gantt bar tabindex=-1 + manual focu…
MichaelUray May 15, 2026
84c5279
fix(tracker-resources): restore gantt files and lost strings post-rebase
MichaelUray May 15, 2026
48ad69b
feat(tracker-resources): add sidebar-sort cycle + comparators
MichaelUray May 15, 2026
a68a384
fix(tracker-resources): tighten sidebar-sort test fixture typing (app…
MichaelUray May 15, 2026
d1a8c4b
fix(tracker-resources): add missing lib modules + type fixes for svel…
MichaelUray May 15, 2026
bf97fff
fix(tracker-resources): make Ctrl+Wheel zoom work in month and quarter
MichaelUray May 15, 2026
4d35644
fix(view-resources): hide group-by/sort in ViewOptions popup when vie…
MichaelUray May 15, 2026
7de6b70
chore(tracker-resources): scrub internal tier/version markers from in…
MichaelUray May 15, 2026
ac394f2
feat(tracker-resources): wire per-column toggles for extended Gantt s…
MichaelUray May 16, 2026
fa8ea71
fix(gantt): left-align corner-range collapse/expand-all buttons
MichaelUray May 18, 2026
147efb3
fix(tracker-resources): resolve eslint errors and apply formatting fo…
MichaelUray Jul 3, 2026
f2e2e56
fix(tracker-resources): repair GanttView imports and exporter querySe…
MichaelUray Jul 3, 2026
2d43354
chore(tracker): reconcile Gantt sources after develop rebase
MichaelUray Jul 9, 2026
a7df7d0
build: refresh pnpm-lock.yaml for rebased dependency set
MichaelUray Jul 9, 2026
b9e1f99
feat(tracker-resources): add flash-store helper for undo visual feedback
MichaelUray May 15, 2026
087b7b2
feat(tracker-resources): add UndoManager with apply + conflict-detect…
MichaelUray May 15, 2026
32eb8fc
feat(tracker-resources): record undo entries for dependency edit + de…
MichaelUray May 15, 2026
7044ebf
feat(tracker-resources): add pure bulk-selection helpers for gantt
MichaelUray May 15, 2026
1821f1f
feat(tracker-resources): add bulk-drag predecessor boundary computation
MichaelUray May 15, 2026
141123f
feat(tracker-resources): thread bulk-drag co-drag state through drag …
MichaelUray May 15, 2026
4b22c97
feat(tracker-resources): commit bulk-drag primaries through single ca…
MichaelUray May 15, 2026
aaa748c
fix(tracker-resources): undo conflict feedback + cascade-atomicity re…
MichaelUray May 15, 2026
db0af84
fix(tracker-resources): route undo/redo relation-delete through remov…
MichaelUray May 15, 2026
c84c3b9
feat(tracker-resources): add gantt-view-options helpers for saved-vie…
MichaelUray May 15, 2026
a5a6142
feat(tracker-resources): add saved-views filter + partition helpers
MichaelUray May 15, 2026
b3b1c41
i18n(tracker): add GanttSavedView* strings EN+DE for Saved Gantt-Views
MichaelUray May 15, 2026
65b09e4
chore(tracker-resources): scrub internal tier/version markers from in…
MichaelUray May 15, 2026
ee7051d
fix(tracker-resources): resolve eslint errors in tier2
MichaelUray Jul 3, 2026
c7721ac
chore(tracker): reconcile ru.json i18n after develop rebase
MichaelUray Jul 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
144 changes: 143 additions & 1 deletion common/config/rush/pnpm-lock.yaml

Large diffs are not rendered by default.

33 changes: 32 additions & 1 deletion models/tracker/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,9 @@ function defineFilters (builder: Builder): void {
key: 'milestone',
component: view.component.ObjectFilter,
showNested: false
}
},
'startDate',
'dueDate'
],
ignoreKeys: ['number', 'estimation', 'attachedTo'],
getVisibleFilters: tracker.function.GetVisibleFilters
Expand Down Expand Up @@ -596,6 +598,35 @@ export function createModel (builder: Builder): void {
tracker.ids.IssueRemovedActivityViewlet
)

// — Activity-Log Remove-Detail Fix.
// Three symmetric viewlets so IssueRelation add/remove/update show up in
// the issue activity feed with a kind+lag+target.title snapshot instead
// of the previous empty "removed related to:" row. The
// RelationActivityPresenter reuses IssueRelationPresenter, which is
// already registered as the ObjectPresenter for tracker.class.IssueRelation
// (models/tracker/src/presenters.ts).
builder.createDoc(activity.class.DocUpdateMessageViewlet, core.space.Model, {
objectClass: tracker.class.IssueRelation,
action: 'create',
icon: tracker.icon.Issue,
label: tracker.string.AddedRelation,
component: tracker.component.RelationActivityPresenter
})
builder.createDoc(activity.class.DocUpdateMessageViewlet, core.space.Model, {
objectClass: tracker.class.IssueRelation,
action: 'remove',
icon: tracker.icon.Issue,
label: tracker.string.RemovedRelation,
component: tracker.component.RelationActivityPresenter
})
builder.createDoc(activity.class.DocUpdateMessageViewlet, core.space.Model, {
objectClass: tracker.class.IssueRelation,
action: 'update',
icon: tracker.icon.Issue,
label: tracker.string.UpdatedRelation,
component: tracker.component.RelationActivityPresenter
})

builder.createDoc(
activity.class.DocUpdateMessageViewlet,
core.space.Model,
Expand Down
120 changes: 119 additions & 1 deletion models/tracker/src/migration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,16 +38,20 @@ import { DOMAIN_SPACE } from '@hcengineering/model-core'
import { DOMAIN_TASK, migrateDefaultStatusesBase } from '@hcengineering/model-task'
import tags from '@hcengineering/tags'
import task from '@hcengineering/task'
import tracker, {
import {
type Issue,
type IssueRelation,
type IssueStatus,
type Project,
TimeReportDayType,
trackerId
} from '@hcengineering/tracker'
import view, { type ViewOptionModel } from '@hcengineering/view'

import { classicIssueTaskStatuses } from '.'
import tracker from './plugin'
import { DOMAIN_TRACKER } from './types'
import { ganttViewOptions } from './viewlets'

async function createDefaultProject (tx: TxOperations): Promise<void> {
const current = await tx.findOne(tracker.class.Project, {
Expand Down Expand Up @@ -181,6 +185,40 @@ export async function migrateAddStartDate (client: MigrationClient): Promise<voi
)
}

// Phase 1 (Visual Polish) adds four new ViewOptions to the IssueGantt
// viewlet (ganttBarLabelLeft/Inside/Right + ganttQuickInfoOnClick).
// builder.createDoc is idempotent, so existing workspaces don't pick
// up the new entries on upgrade-workspace. Re-add the missing ones by
// merging on `key`, preserving the user's groupBy/orderBy and any
// already-stored entries. Idempotent — a re-run is a no-op.
//
// Mirrors models/card/src/migration.ts:addShowAllVersionsViewOption.
async function addGanttPhase1ViewOptions (client: MigrationUpgradeClient): Promise<void> {
const txOp = new TxOperations(client, core.account.System)

const viewlets = await client.findAll(view.class.Viewlet, {
_id: tracker.viewlet.IssueGantt
})
if (viewlets.length === 0) return

const desiredOther = ganttViewOptions().other ?? []

for (const v of viewlets) {
const current = v.viewOptions ?? { groupBy: [], orderBy: [], other: [] }
const currentOther: ViewOptionModel[] = current.other ?? []
const existingKeys = new Set(currentOther.map((o) => o.key))
const missing = desiredOther.filter((o) => !existingKeys.has(o.key))
if (missing.length === 0) continue

await txOp.update(v, {
viewOptions: {
...current,
other: [...currentOther, ...missing]
}
})
}
}

async function migrateDefaultStatuses (client: MigrationClient, logger: ModelLogger): Promise<void> {
const defaultTypeId = tracker.ids.ClassingProjectType
const typeDescriptor = tracker.descriptors.ProjectType
Expand Down Expand Up @@ -375,6 +413,66 @@ async function migrateIssueStatuses (client: MigrationClient): Promise<void> {
)
}

/**
* — Activity-Log Remove-Detail Fix.
*
* Legacy IssueRelation removals went through `ops.removeDoc`, which emits
* a bare TxRemoveDoc without parent-issue attachment. The activity
* pipeline therefore wrote a DocUpdateMessage whose attachedTo is the
* relation itself, never showing up in the issue's activity feed. This
* migration re-attaches such DUMs to their parent issue by looking up the
* original TxCreateDoc of the now-removed IssueRelation. Best-effort:
* when the create-tx is missing (db compaction) the DUM still gets
* `updateCollection='relations'` so the activity feed at least shows
* "removed dependency" without the target detail.
*
* Idempotent — once a DUM has Issue-side attachment + `updateCollection`,
* the predicate skips it on subsequent runs. The predicate is a local
* 4-LOC copy of `isBrokenRelationDum` in
* `plugins/tracker-resources/src/components/gantt/lib/relation-activity-migration.ts`
* (cannot import across package layers — models/tracker is below
* tracker-resources). The helper module is the one with unit tests.
*/
async function migrateRelationActivityAttachment (client: MigrationClient): Promise<void> {
const issueClass = tracker.class.Issue
const dums = await client.find<DocUpdateMessage>(DOMAIN_ACTIVITY, {
_class: activity.class.DocUpdateMessage,
objectClass: tracker.class.IssueRelation,
action: 'remove'
})
if (dums.length === 0) return
for (const dum of dums) {
const isBroken = dum.attachedToClass !== issueClass || dum.updateCollection !== 'relations'
if (!isBroken) continue
// Find the create-tx for this relation. The relation objectId remains
// the same across the doc's whole life — that's the key we look up.
const createTxes = await client.find<TxCreateDoc<IssueRelation>>(
DOMAIN_MODEL_TX,
{
_class: core.class.TxCreateDoc,
objectId: dum.objectId as Ref<IssueRelation>
},
{ limit: 1 }
)
const createTx = createTxes[0]
const patch: Partial<DocUpdateMessage> = {}
if (createTx?.attachedTo !== undefined && createTx.attachedToClass !== undefined) {
patch.attachedTo = createTx.attachedTo
patch.attachedToClass = createTx.attachedToClass
patch.updateCollection = createTx.collection ?? 'relations'
} else {
// Placeholder: ensure the DUM at least shows up in the parent
// issue's feed by giving it the collection name; we leave
// attachedTo as-is (the runtime DocUpdateMessageObjectValue will
// still try buildRemovedDoc with objectId, which often succeeds
// even when the create-tx for the *DUM's* attachedTo is gone).
if (dum.updateCollection === 'relations') continue
patch.updateCollection = 'relations'
}
await client.update<DocUpdateMessage>(DOMAIN_ACTIVITY, { _id: dum._id }, patch)
}
}

export const trackerOperation: MigrateOperation = {
async preMigrate (client: MigrationClient, logger: ModelLogger, mode): Promise<void> {
await tryMigrate(mode, client, trackerId, [
Expand Down Expand Up @@ -414,6 +512,22 @@ export const trackerOperation: MigrateOperation = {
state: 'gantt-add-startdate',
mode: 'upgrade',
func: migrateAddStartDate
},
{
// Phase-2 working-days calendar. The property is optional and
// additive — every existing Project keeps `workingDaysConfig =
// undefined` (legacy calendar-day semantics). The migration entry
// exists only so the tracker state-tracker registers the schema
// version bump; no data is touched.
state: 'gantt-add-working-days-config',
mode: 'upgrade',
func: async () => {}
},
{
// — Activity-Log Remove-Detail Fix.
state: 'relation-activity-attached-v1',
mode: 'upgrade',
func: migrateRelationActivityAttachment
}
])
},
Expand All @@ -425,6 +539,10 @@ export const trackerOperation: MigrateOperation = {
const tx = new TxOperations(client, core.account.System)
await createDefaults(tx)
}
},
{
state: 'add-gantt-phase1-view-options',
func: addGanttPhase1ViewOptions
}
])
}
Expand Down
1 change: 1 addition & 0 deletions models/tracker/src/plugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ export default mergeIds(trackerId, tracker, {
IssueList: '' as Ref<Viewlet>,
IssueTemplateList: '' as Ref<Viewlet>,
IssueKanban: '' as Ref<Viewlet>,
IssueGantt: '' as Ref<Viewlet>,
MilestoneList: '' as Ref<Viewlet>,
ComponentList: '' as Ref<Viewlet>,
ProjectList: '' as Ref<Viewlet>,
Expand Down
9 changes: 9 additions & 0 deletions models/tracker/src/presenters.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,15 @@ export function definePresenters (builder: Builder): void {
presenter: tracker.component.NotificationIssuePresenter
})

//
// IssueRelation — single-line "FS +Nd → OSTRO-29 Title" presenter so
// the activity feed shows which dependency was added or removed
// (instead of the generic "Dependency" class label).
//
builder.mixin(tracker.class.IssueRelation, core.class.Class, view.mixin.ObjectPresenter, {
presenter: tracker.component.IssueRelationPresenter
})

builder.mixin(tracker.class.Issue, core.class.Class, view.mixin.PreviewPresenter, {
presenter: tracker.component.IssuePreview
})
Expand Down
28 changes: 27 additions & 1 deletion models/tracker/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,8 @@ import {
type RelatedIssueTarget,
type RelatedSpaceRule,
type TimeReportDayType,
type TimeSpendReport
type TimeSpendReport,
type WorkingDaysConfig
} from '@hcengineering/tracker'
import tracker from './plugin'
import { type TaskType } from '@hcengineering/task'
Expand Down Expand Up @@ -137,6 +138,9 @@ export class TProject extends TTaskProject implements Project {

@Prop(Collection(tracker.class.RelatedIssueTarget), tracker.string.RelatedIssues)
relatedIssueTargets!: number

@Prop(TypeRecord(), tracker.string.WorkingDaysConfig)
workingDaysConfig?: WorkingDaysConfig
}
/**
* @public
Expand Down Expand Up @@ -242,6 +246,15 @@ export class TIssue extends TTask implements Issue {
@Prop(TypeDate(DateRangeMode.DATETIME), tracker.string.DueDate)
declare dueDate: Timestamp | null

// Phase 1.B — soft deadline, independent of dueDate. Optional.
// When set, the Gantt renders a flag marker at this date and flags the
// issue as overdue when dueDate > deadline. Undefined for existing issues
// until the user opts in via the Issue editor (Phase 1 ships the
// inline ControlPanel field; a Gantt context-menu shortcut is a
// separate follow-up, see Out-of-scope section).
@Prop(TypeDate(DateRangeMode.DATETIME), tracker.string.Deadline)
deadline?: Timestamp | null

@Prop(TypeRef(tracker.class.Milestone), tracker.string.Milestone, { icon: tracker.icon.Milestone })
@Index(IndexKind.Indexed)
milestone!: Ref<Milestone> | null
Expand All @@ -263,6 +276,19 @@ export class TIssue extends TTask implements Issue {

@Prop(Collection(time.class.ToDo), getEmbeddedLabel('Action Items'))
todos?: CollectionSize<ToDo>

/**
* — Auto-Scheduling-Toggle.
*
* Optional property so existing issues stay on the default cascade
* behaviour with no migration. `@Hidden` keeps the field out of the
* generic filter/sort UI in `getFiltredKeys`; the dedicated toggle in
* `ControlPanel.svelte` is the supported entry point. Cascade-time
* checks live in `gantt/lib/scheduler.ts` (Step 5b filter).
*/
@Prop(TypeString(), tracker.string.SchedulingMode)
@Hidden()
schedulingMode?: 'auto' | 'manual'
}
/**
* @public
Expand Down
Loading