Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
248 commits
Select commit Hold shift + click to select a range
0e6d0df
feat(tracker): add Gantt scheduling schema (startDate + IssueRelation)
MichaelUray May 15, 2026
5c9faf7
test(model-tracker): add migrateAddStartDate jest tests
MichaelUray May 15, 2026
8641423
feat(model-tracker): add migrateAddStartDate + wire into trackerOpera…
MichaelUray May 15, 2026
8d932e8
feat(tracker): expose Issue.startDate / Milestone.startDate in UI; ti…
MichaelUray May 15, 2026
c94a5cc
fix(tracker): set explicit @Prop ranks for Milestone date fields
MichaelUray May 15, 2026
f84e497
fix(tracker-resources): EditMilestone renders Status/Start/Target in …
MichaelUray May 15, 2026
7d745f9
fix(fulltext): bump model version to 0.7.423 to match deployed worksp…
MichaelUray May 17, 2026
32cef1e
feat(tracker): register Gantt view tab (placeholder UI)
MichaelUray May 15, 2026
cd7a58a
feat(tracker-resources): add Gantt lib types
MichaelUray May 15, 2026
e9dd999
test(tracker-resources): add failing Gantt time-scale tests
MichaelUray May 15, 2026
7d5b84f
feat(tracker-resources): implement Gantt time-scale lib
MichaelUray May 15, 2026
a8e88a3
test(tracker-resources): add failing Gantt layout tests
MichaelUray May 15, 2026
1c63a84
feat(tracker-resources): implement Gantt layout lib
MichaelUray May 15, 2026
bd9a07c
feat(tracker-resources): add GanttHeader.svelte
MichaelUray May 15, 2026
dcfd750
feat(tracker-resources): add GanttBar.svelte (regular + summary claws)
MichaelUray May 15, 2026
e48b940
feat(tracker-resources): add GanttTodayMarker.svelte
MichaelUray May 15, 2026
291e524
feat(tracker-resources): add GanttMilestoneFlag.svelte
MichaelUray May 15, 2026
51c81c7
feat(tracker-resources): add GanttCanvas.svelte
MichaelUray May 15, 2026
c74ea95
feat(tracker-resources): add GanttSidebar.svelte
MichaelUray May 15, 2026
e5f4e0d
feat(tracker-resources): add GanttToolbar.svelte (zoom buttons)
MichaelUray May 15, 2026
a91cf34
feat(tracker-resources): GanttView wires Sidebar+Canvas+Toolbar with …
MichaelUray May 15, 2026
d0f6744
- layout.ts: orphan child issues (parent filtered out) now emit as roots
MichaelUray May 15, 2026
fa3b39c
Toolbar (replaces previous floating zoom):
MichaelUray May 15, 2026
83feba5
- SVG horizontal-scroll bug: GanttHeader and GanttCanvas now render at
MichaelUray May 15, 2026
7916e68
feat(tracker-resources): wire Gantt sidebar toggles into Customize-View
MichaelUray May 15, 2026
2996127
fix(tracker-resources): clip GanttSidebar inside its host
MichaelUray May 15, 2026
6131bbc
fix(tracker-resources): unified Gantt scroll container (Plane-style s…
MichaelUray May 15, 2026
5105650
feat(tracker-resources): + New issue button in Gantt toolbar
MichaelUray May 15, 2026
e67d341
chore(tracker): localize Gantt UI strings + minimize locale diffs
MichaelUray May 15, 2026
2e2da19
feat(tracker-resources): blue plus-only NewIssueHeader
MichaelUray May 15, 2026
1ddb3c5
fix(tracker-resources): resize handle no longer fights canvas pan
MichaelUray May 15, 2026
efc1cf6
feat(tracker-resources): sticky-bottom horizontal scrollbar (Plane-st…
MichaelUray May 15, 2026
ae74b0e
feat(tracker-resources): custom DOM scrollbar thumb (visible everywhere)
MichaelUray May 15, 2026
6f21093
feat(tracker-resources): hardened scrollbars + status colors + tight …
MichaelUray May 15, 2026
ad9c23d
feat(tracker-resources): status badge column + ganttShowStatus toggle
MichaelUray May 15, 2026
9be5b4e
feat(tracker-resources): Tracker UI redesign polish v27
MichaelUray May 15, 2026
1ef25b4
feat(tracker-resources): inline-add row in Gantt sidebar (PR2.1)
MichaelUray May 15, 2026
f5368f8
feat(model-tracker): register startDate + dueDate as Issue filters
MichaelUray May 15, 2026
f8f7daf
fix(tracker-resources): hide Gantt h-scrollbar when there's no overflow
MichaelUray May 15, 2026
6d74120
chore(tracker-resources): remove internal review markers from inline …
MichaelUray May 15, 2026
a0b3095
feat(tracker-resources): Gantt drag/resize state types
MichaelUray May 15, 2026
930801d
feat(tracker-resources): drag-controller reducer skeleton + idle tran…
MichaelUray May 15, 2026
cf44863
feat(tracker-resources): drag-controller — body drag transitions
MichaelUray May 15, 2026
aafc648
feat(tracker-resources): drag-controller — resize-left/right with cla…
MichaelUray May 15, 2026
9f87af1
feat(tracker-resources): scheduler.descendantsWithDates (cycle-safe BFS)
MichaelUray May 15, 2026
f2b2836
feat(tracker): i18n keys for Gantt edit-mode (set-start-date + 5 toas…
MichaelUray May 15, 2026
c1b3a24
feat(tracker-resources): local Set-start-date action for Gantt menu
MichaelUray May 15, 2026
b923569
feat(tracker-resources): GanttView activeDrag store + per-issue edit …
MichaelUray May 15, 2026
1b7a732
feat(tracker-resources): GanttBar edge-detect + resize-handle hit areas
MichaelUray May 15, 2026
4dfcf38
feat(tracker-resources): GanttCanvas forwards bar events + mounts res…
MichaelUray May 15, 2026
35f411e
feat(tracker-resources): wire drag reducer + atomic commitDrag in Gan…
MichaelUray May 15, 2026
f54ab27
feat(tracker-resources): active-drag preview geometry + tint on GanttBar
MichaelUray May 15, 2026
c01a244
feat(tracker-resources): right-click context menu on bar + sidebar row
MichaelUray May 15, 2026
76f5689
feat(tracker-resources): keyboard Tab cycle + arrow-shift for Gantt bars
MichaelUray May 15, 2026
31a4ef6
feat(tracker-resources): dim non-active rows during drag (spotlight f…
MichaelUray May 15, 2026
946b819
feat(tracker-resources): drag-from-unscheduled — drop on canvas sets …
MichaelUray May 15, 2026
3b4bd54
fix(tracker-resources): allow direct idle → drag in reducer
MichaelUray May 15, 2026
cf7ba25
feat(tracker-resources): slim Gantt context menu + fix pan-grip colli…
MichaelUray May 15, 2026
e544048
fix(tracker-resources): Gantt menu — deny-list + restore Open/Parent/…
MichaelUray May 15, 2026
e8b31b4
feat(tracker): Gantt Hierarchy submenu + EditIssue parent + header su…
MichaelUray May 15, 2026
7d22e29
feat(tracker-resources): Gantt select-first drag + confirm popup + su…
MichaelUray May 15, 2026
5db9d53
fix(tracker-resources): Gantt parent-drag truth source + canvasX offs…
MichaelUray May 15, 2026
abc9a92
chore(tracker-resources): Gantt polish — drop stale CSS, i18n ARIA la…
MichaelUray May 15, 2026
38ab080
chore(tracker-resources): remove internal review markers from inline …
MichaelUray May 15, 2026
1f9b8d3
fix(tracker-resources): Gantt bar selection — cursor, visual, single-…
MichaelUray May 15, 2026
c679e5b
fix(tracker-resources): Gantt bar selection — reactive prop helpers
MichaelUray May 15, 2026
5eeb61f
feat(tracker-resources): Gantt sidebar — milestone single-click opens…
MichaelUray May 15, 2026
61e9087
fix(tracker-resources): Gantt openMilestone resolves full Milestone b…
MichaelUray May 15, 2026
0a75b81
feat(tracker-resources): Gantt PR3.3 — milestone bars editable with c…
MichaelUray May 15, 2026
607ad7d
feat(tracker-resources): Gantt pan from unselected bars
MichaelUray May 15, 2026
84eaa9a
feat(tracker): add 13 i18n keys for Gantt dependencies (PR4a)
MichaelUray May 15, 2026
d577ced
feat(model-tracker): add ganttShowPredecessors ViewOption (PR4a)
MichaelUray May 15, 2026
dd1f1ec
feat(tracker-resources): predecessor-format helpers (PR4a)
MichaelUray May 15, 2026
3ffad13
feat(tracker-resources): scheduler.wouldCreateCycle (PR4a)
MichaelUray May 15, 2026
5d4d2e4
feat(tracker-resources): dependency-router endpoints (PR4a)
MichaelUray May 15, 2026
52fac03
feat(tracker-resources): dependency-router bezier + arrowhead (PR4a)
MichaelUray May 15, 2026
cfea226
feat(tracker-resources): dependency-router connectedIssueIds (PR4a)
MichaelUray May 15, 2026
2202b58
feat(tracker-resources): DragState + DragEvent connector variants (PR4a)
MichaelUray May 15, 2026
7c3e6a5
feat(tracker-resources): drag-controller connector state transitions …
MichaelUray May 15, 2026
eaaef43
fix(tracker-resources): drag-controller no stale target leak (PR4a)
MichaelUray May 15, 2026
d232603
feat(tracker-resources): GanttConnectorDot visual affordance (PR4a)
MichaelUray May 15, 2026
fd21ae9
feat(tracker-resources): GanttDependencyArrow bezier + lag pill (PR4a)
MichaelUray May 15, 2026
dce5f16
feat(tracker-resources): GanttDependencyLayer overlay (PR4a)
MichaelUray May 15, 2026
0eb2e39
feat(tracker-resources): DependencyEditor popup (PR4a)
MichaelUray May 15, 2026
9c4fe95
fix(tracker-resources): GanttDependencyLayer use stroke-dasharray:0 n…
MichaelUray May 15, 2026
2c1a002
feat(tracker-resources): GanttBar hover state + connector dot mount (…
MichaelUray May 15, 2026
84eb371
fix(tracker-resources): GanttBar isMilestoneSummary use dragTarget (P…
MichaelUray May 15, 2026
4e2dc87
feat(tracker-resources): GanttCanvas mounts DependencyLayer + barRect…
MichaelUray May 15, 2026
c5b1ce5
feat(tracker-resources): GanttSidebar predecessor column (PR4a)
MichaelUray May 15, 2026
8007866
feat(tracker-resources): GanttView dependency wiring (PR4a)
MichaelUray May 15, 2026
2cfe71c
fix(tracker): de-duplicate 13 PR4a i18n keys from base namespace
MichaelUray May 15, 2026
37d1457
fix(tracker-resources): guard relationQuery against empty visibleIssu…
MichaelUray May 15, 2026
11fa6be
fix(tracker-resources): drop $or relationQuery, filter client-side (P…
MichaelUray May 15, 2026
96fa096
fix(tracker-resources): harden Gantt dependency init and bar clicks
MichaelUray May 15, 2026
aced2bd
fix(tracker-resources): pan from Gantt bars on drag
MichaelUray May 15, 2026
0ad61f9
fix(tracker-resources): restore selected Gantt bar editing
MichaelUray May 15, 2026
1db3a86
fix(front): clean startup console noise
MichaelUray May 15, 2026
c5914fe
fix(notification-resources): return ArrayBuffer-backed push key
MichaelUray May 15, 2026
515b128
fix(tracker-resources): stabilize gantt viewport and connectors
MichaelUray May 15, 2026
c152840
feat(tracker-resources): adaptive Gantt time-scale + optimistic depen…
MichaelUray May 15, 2026
ff78f01
fix(tracker-resources): inline gantt live-bezier reactive deps
MichaelUray May 15, 2026
43bff5c
feat(tracker-resources): PR4b cascade simulation types
MichaelUray May 15, 2026
18be114
feat(tracker-resources): PR4b detectCycle DFS helper
MichaelUray May 15, 2026
a788abe
feat(tracker-resources): PR4b addScheduleDays Phase-2 hook
MichaelUray May 15, 2026
8298188
fix(tracker-resources): PR4b test file license header + drop dead DAY…
MichaelUray May 15, 2026
7ff0165
feat(tracker-resources): PR4b simulateCascade FS push + no-cascade
MichaelUray May 15, 2026
2abeb06
feat(tracker-resources): PR4b cascade SS/FF/SF anchor model
MichaelUray May 15, 2026
887abea
feat(tracker-resources): PR4b cascade pull-predecessor
MichaelUray May 15, 2026
d2db027
feat(tracker-resources): PR4b cascade parent-drag + merge tests
MichaelUray May 15, 2026
16d4ce4
feat(tracker-resources): PR4b cascade chain + iteration-overflow tests
MichaelUray May 15, 2026
2f7ed2a
feat(tracker-resources): PR4b cascade cycle bailout test
MichaelUray May 15, 2026
85fdfeb
feat(tracker-resources): PR4b cascade permission-denied test
MichaelUray May 15, 2026
9f5ab4e
feat(tracker-resources): PR4b cascade hidden-issue scope test
MichaelUray May 15, 2026
8cd6357
feat(tracker-resources): PR4b cascade i18n keys (en)
MichaelUray May 15, 2026
e879ffb
feat(tracker-resources): PR4b ConfirmCascadePopup mini-timeline
MichaelUray May 15, 2026
cda2175
docs(tracker-resources): PR4b scheduler comment polish
MichaelUray May 15, 2026
e28cbd6
feat(tracker-resources): PR4b commitWithCascade body-drag wiring + si…
MichaelUray May 15, 2026
b61979e
fix(tracker-resources): PR4b keep drag preview alive while cascade po…
MichaelUray May 15, 2026
9579c24
feat(tracker-resources): show Gantt IssueRelations in issue editor
MichaelUray May 15, 2026
9bf5961
fix(tracker-resources): always show Dependencies section + ganttDebug…
MichaelUray May 15, 2026
6f3bc98
feat(tracker-resources): PR4b popup polish + legacy confirm parity
MichaelUray May 15, 2026
0e1446f
fix(tracker-resources): PR4b svelte-check + type-narrowing fixes
MichaelUray May 15, 2026
55c8941
fix(tracker-resources): PR4b permission check before no-cascade return
MichaelUray May 15, 2026
03197fe
feat(tracker-resources): PR5 critical-path types
MichaelUray May 15, 2026
fabacc0
feat(tracker-resources): PR5 critical-path scaffold + cycle bailout
MichaelUray May 15, 2026
e3689ee
feat(tracker-resources): PR5 i18n keys (en)
MichaelUray May 15, 2026
93b675f
feat(tracker): PR5 ganttCriticalPath + ganttSlackColumn view options
MichaelUray May 15, 2026
f14889f
feat(tracker-resources): PR5 critical-path UI wiring
MichaelUray May 15, 2026
f370f22
feat(tracker-resources): PR6 export + keyboard shortcuts + DE i18n
MichaelUray May 15, 2026
c3a080d
fix(tracker-resources): PR5 critical-path topoSort guard + destroy timer
MichaelUray May 15, 2026
40396c4
fix(tracker-resources): PR5 violated bars paint red
MichaelUray May 15, 2026
76ed434
fix(tracker-resources): connector dot above arrows + target drop indi…
MichaelUray May 15, 2026
a2d0fb4
feat(tracker): readable Dependencies panel + IssueRelation activity p…
MichaelUray May 15, 2026
b6801c5
refactor(tracker-resources): collapse connector-drag to a single even…
MichaelUray May 15, 2026
c628288
refactor(tracker-resources): drop canvas-level connector delegation
MichaelUray May 15, 2026
dc7c779
fix(tracker-resources): deps panel — drop ignore, default to Issues t…
MichaelUray May 15, 2026
ebf7e24
fix(tracker): scope dependency picker to current project
MichaelUray May 15, 2026
f08ee02
fix(tracker): dependency picker — wrap ObjectPopup so items render
MichaelUray May 15, 2026
6501602
feat(tracker): label LinkExistingSubIssue button + DE translation
MichaelUray May 15, 2026
bc2414a
feat(tracker): unified hierarchy add chooser + resizable pickers
MichaelUray May 15, 2026
4478500
feat(tracker): dependency direction chooser — predecessor + successor
MichaelUray May 15, 2026
a6eddd5
fix(tracker): cycle check uses project-wide relations + neutralize re…
MichaelUray May 15, 2026
1e0aaad
fix(tracker-resources): confirm dialog before dependency removal
MichaelUray May 15, 2026
9b483a0
fix(tracker-resources): align relationSatisfied with new anchor seman…
MichaelUray May 15, 2026
2dc2946
feat(tracker-resources): wire project workingDaysConfig into Gantt sc…
MichaelUray May 15, 2026
b20e4f1
fix(tracker-resources)!: respect working-days in cascade scheduler, f…
MichaelUray May 15, 2026
3ea49e0
feat(tracker-resources): paint non-working-day tint in Gantt canvas
MichaelUray May 15, 2026
038e697
feat(models/tracker): persist Project.workingDaysConfig + EN/DE strings
MichaelUray May 15, 2026
7ad3d43
feat(tracker-resources): respect working-days in critical-path
MichaelUray May 15, 2026
d9c4582
feat(tracker): add WorkingDaysConfig type + scheduler working-days he…
MichaelUray May 15, 2026
f7898ff
fix(tracker-resources): re-stamp virtualized sidebar row y from curre…
MichaelUray May 15, 2026
5476945
test(tracker-resources): cover groupRowsToLayoutRows adapter
MichaelUray May 15, 2026
f835bef
fix(tracker-resources): pass IntlString to Button label in Scheduling…
MichaelUray May 15, 2026
7b31a24
test(tracker-resources): tighten sidebar-sort fixture typing
MichaelUray May 15, 2026
0f608d5
feat(tracker-resources): add GanttSidebarHeaderCell + GanttSidebarCol…
MichaelUray May 15, 2026
6f62efd
feat(tracker-resources): tag cascade commits with cascadeToken for do…
MichaelUray May 15, 2026
2f40888
feat(tracker-resources): add sidebar-columns pure helpers for Phase 3a
MichaelUray May 15, 2026
bb36d49
feat(tracker-resources): wire Phase 3b filter-bar + group-by swimlanes
MichaelUray May 15, 2026
838704c
feat(tracker-resources): add group-by + filter pure helpers for Phase 3b
MichaelUray May 15, 2026
37d601f
feat(tracker-resources): filter manual issues from cascade + add casc…
MichaelUray May 15, 2026
475d449
feat(tracker): add optional Issue.schedulingMode property + model dec…
MichaelUray May 15, 2026
57b4293
feat(tracker-resources): add EN+DE i18n for off-viewport arrow indica…
MichaelUray May 15, 2026
98bbb93
feat(tracker-resources): show n-primaries hint in cascade confirm popup
MichaelUray May 15, 2026
0ed7a32
feat(tracker-assets): add EN+DE i18n for scheduling-mode toggle
MichaelUray May 15, 2026
3e8a6fb
feat(tracker-resources): pipe schedulingMode through GanttCanvas to bars
MichaelUray May 15, 2026
2f5c385
feat(tracker-resources+models): wire Phase 3a extended sidebar grid
MichaelUray May 15, 2026
b4b4844
feat(tracker-resources): render bulk co-drag preview on selected gant…
MichaelUray May 15, 2026
ea3e827
feat(tracker-resources): style gantt tree breadcrumbs and depth guide…
MichaelUray May 15, 2026
d6396ef
feat(tracker-resources): mount UndoManager + wire toolbar buttons + C…
MichaelUray May 15, 2026
0dfd1bf
feat(tracker-resources): add scheduling-mode toggle to issue control …
MichaelUray May 15, 2026
45d9c29
feat(tracker-resources): render manual-schedule pin glyph in GanttBar
MichaelUray May 15, 2026
d2275b2
feat(tracker-resources): clip dep-arrows + add off-viewport row indic…
MichaelUray May 15, 2026
9a3afcc
feat(models/tracker): register ganttGroupBy dropdown ViewOption
MichaelUray May 15, 2026
78795f9
feat(tracker-resources): add breadcrumb-aware filter and within-level…
MichaelUray May 15, 2026
5453856
feat(tracker): i18n + IntlString refs for Phase 1 (Visual Polish)
MichaelUray May 15, 2026
3df8a9a
feat(tracker-resources): add bar-label resolver
MichaelUray May 15, 2026
5314aaa
feat(tracker-resources): wire bar-label ViewOptions through GanttView…
MichaelUray May 15, 2026
a329834
feat(tracker-resources): deadline-marker helpers + tests
MichaelUray May 15, 2026
94d5e0c
feat(tracker-resources): three configurable bar-label slots in GanttBar
MichaelUray May 15, 2026
c8049ff
feat(tracker): add optional deadline field to Issue
MichaelUray May 15, 2026
3708e2a
feat(tracker-resources): add html2canvas + jspdf dependencies for Gan…
MichaelUray May 15, 2026
cda52ed
feat(tracker-resources): keyboard shortcuts T/D/W/M/Q
MichaelUray May 15, 2026
9cf7439
fix(tracker-resources): center Gantt nav, reorder PNG/PDF/Fullscreen,…
MichaelUray May 15, 2026
e2060c4
feat(importer): support Gantt scheduling fields in HulyFormatImporter
MichaelUray May 15, 2026
38dfd81
feat(tracker): expose Issue.deadline on the public interface
MichaelUray May 15, 2026
5e42232
feat(tracker-resources): list Phase 1 keyboard shortcuts in GanttHelp…
MichaelUray May 15, 2026
f290a41
feat(model-tracker): migrate IssueGantt viewOptions for existing work…
MichaelUray May 15, 2026
09c06e1
fix(importer): use bare 'today+Nd' syntax for relative-date placeholders
MichaelUray May 15, 2026
300a6dd
feat(tracker-resources): consolidate Gantt toolbar + add fullscreen +…
MichaelUray May 15, 2026
0e6cedb
feat(tracker-resources): deadline-marker render layer in GanttCanvas
MichaelUray May 15, 2026
944401e
feat(tracker-resources): export full Gantt (sidebar+bars) to PNG/PDF …
MichaelUray May 15, 2026
d829f2a
feat(tracker-resources): wire QuickInfoPopup to single-click bar (opt…
MichaelUray May 15, 2026
0306402
fix(tracker-resources): move Gantt toolbar to second header row + web…
MichaelUray May 15, 2026
17887d5
feat(tracker-resources): GanttQuickInfoPopup component
MichaelUray May 15, 2026
74b617d
chore(model-tracker): drop unused Viewlet type import from migration.ts
MichaelUray May 15, 2026
2883e83
fix(tracker-resources): disable 'Open Sub Issues' button when no sub-…
MichaelUray May 15, 2026
516a7df
feat(tracker-resources): Deadline editor in Issue ControlPanel
MichaelUray May 15, 2026
8c70959
fix(tracker-resources): drop duplicate viewlet.IssueGantt declaration
MichaelUray May 15, 2026
6c0fecb
refactor(tracker-resources): drop gantt-toolbar Filter button, use Fi…
MichaelUray May 15, 2026
9f409f5
fix(tracker-resources): label Gantt priority filter as Urgent/High/Me…
MichaelUray May 15, 2026
afc613a
feat(tracker-resources): thread nameLookup map through group-by helpers
MichaelUray May 15, 2026
f59c71c
fix(tracker-resources): hide standard Customize View buttons in Gantt…
MichaelUray May 15, 2026
0963d68
fix(tracker-resources): freeze Gantt drag preview while confirm popup…
MichaelUray May 15, 2026
6a55f28
fix(models/tracker): declare viewlet.IssueGantt in model plugin
MichaelUray May 15, 2026
41d415e
feat(tracker-resources): continuous Ctrl+Wheel zoom over gantt canvas
MichaelUray May 15, 2026
0ff679a
fix(tracker-resources): align Gantt extended sidebar grid width and s…
MichaelUray May 15, 2026
ee838c4
fix(tracker-resources): reserve body padding in cascade confirm popup
MichaelUray May 15, 2026
f874b94
fix(tracker-resources): drop duplicate Phase-1 Gantt toolbar to unblo…
MichaelUray May 15, 2026
21fb017
i18n(tracker): add relation activity strings (en + de)
MichaelUray May 15, 2026
b7965d6
feat(models/tracker): migrate legacy IssueRelation remove activity docs
MichaelUray May 15, 2026
10a6788
feat(tracker-resources): add mobile-friendly Gantt pure-logic helpers
MichaelUray May 15, 2026
64d1e5d
fix(tracker-resources): widen row/col to number in diagramGridIndex
MichaelUray May 15, 2026
173350d
feat(tracker-resources): add RelationActivityPresenter for activity feed
MichaelUray May 15, 2026
2429243
feat(tracker-resources): add relation-activity migration helpers
MichaelUray May 15, 2026
8edea89
feat(tracker-resources): add predecessor-list-format helper
MichaelUray May 15, 2026
e2cb90c
feat(tracker-resources): add GanttSaveViewPopup modal (name + fix-win…
MichaelUray May 15, 2026
ea66dfd
feat(models/tracker): register IssueRelation add/remove/update activi…
MichaelUray May 15, 2026
72c6ca2
fix(tracker-resources): use removeCollection for relation deletion so…
MichaelUray May 15, 2026
142e6f8
feat(tracker-resources): wire layoutMode + pinch-zoom into GanttView
MichaelUray May 15, 2026
dc57603
feat(tracker-resources): GanttBar pointer-only events + long-press ro…
MichaelUray May 15, 2026
d569820
fix(models/tracker): use trackerModel.viewlet.IssueGantt in migration
MichaelUray May 15, 2026
6fce0c9
fix(tracker-resources): wrap gantt toolbar on tablet viewports
MichaelUray May 15, 2026
6037c0e
fix(tracker-resources): data-driven PNG/PDF export with full sidebar …
MichaelUray May 15, 2026
51e3e25
fix(tracker-resources): replace gantt tree glyphs with ChevronRight/D…
MichaelUray May 15, 2026
e6984fe
fix(tracker-resources): add aria-label and title to gantt date-nav bu…
MichaelUray May 15, 2026
556049e
fix(tracker-resources): resolve gantt aria-labels via translateCB
MichaelUray May 15, 2026
8d950a6
feat(tracker-resources): add Estimation row to gantt quick-info popover
MichaelUray May 15, 2026
58258ee
fix(tracker-resources): add xmlns to gantt canvas svg root
MichaelUray May 15, 2026
98938f4
refactor(tracker-resources): replace hex colors in gantt with theme v…
MichaelUray May 15, 2026
3480c20
fix(tracker-resources): keep both Customize-View + Configure-Columns …
MichaelUray May 15, 2026
729980c
fix(tracker-resources): move Expand/Collapse-all to sidebar corner cell
MichaelUray May 15, 2026
29ab6c0
fix(tracker-resources): defer scroll-driven translateX sync via rAF t…
MichaelUray May 15, 2026
b499d36
fix(view+card-resources): apply ConfigureColumns tooltip to all Confi…
MichaelUray May 15, 2026
d5c85ad
fix(tracker-resources): close GanttSaveViewPopup on X-click via onCancel
MichaelUray May 15, 2026
3d39dc3
feat(tracker-resources): collapse 4 zoom-preset buttons into Dropdown…
MichaelUray May 15, 2026
a5a2a49
refactor(view-resources): remove dead showViewOptions prop from Viewl…
MichaelUray May 15, 2026
e707fbe
fix(view+tracker-resources): split Customize-View vs Configure-Column…
MichaelUray May 15, 2026
0ebc836
fix(tracker-resources): replace gantt dblclick on mobile with quick-i…
MichaelUray May 15, 2026
d0624aa
docs(tracker-resources): document gantt bar tabindex=-1 + manual focu…
MichaelUray May 15, 2026
206dacb
fix(tracker-resources): restore gantt files and lost strings post-rebase
MichaelUray May 15, 2026
93b6ac8
feat(tracker-resources): add sidebar-sort cycle + comparators
MichaelUray May 15, 2026
b50d4dc
fix(tracker-resources): tighten sidebar-sort test fixture typing (app…
MichaelUray May 15, 2026
15026ad
fix(tracker-resources): add missing lib modules + type fixes for svel…
MichaelUray May 15, 2026
c1e7efb
fix(tracker-resources): make Ctrl+Wheel zoom work in month and quarter
MichaelUray May 15, 2026
9eac860
fix(view-resources): hide group-by/sort in ViewOptions popup when vie…
MichaelUray May 15, 2026
ac2d914
chore(tracker-resources): scrub internal tier/version markers from in…
MichaelUray May 15, 2026
c89e4bd
feat(tracker-resources): wire per-column toggles for extended Gantt s…
MichaelUray May 16, 2026
9144c97
fix(gantt): left-align corner-range collapse/expand-all buttons
MichaelUray May 18, 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
160 changes: 160 additions & 0 deletions common/config/rush/pnpm-lock.yaml

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion common/scripts/version.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
"0.7.422"
"0.7.423"
49 changes: 49 additions & 0 deletions models/tracker/src/__tests__/migration.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
//
// Copyright © 2026 Hardcore Engineering Inc.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
//

import { DOMAIN_TASK } from '@hcengineering/model-task'
import tracker from '@hcengineering/tracker'

import { DOMAIN_TRACKER } from '../types'
import { migrateAddStartDate } from '../migration'

describe('migrateAddStartDate', () => {
it('sets startDate=null on every Issue lacking the field (DOMAIN_TASK)', async () => {
const update = jest.fn().mockResolvedValue(undefined)
const client: any = { update }

await migrateAddStartDate(client)

expect(update).toHaveBeenCalledWith(
DOMAIN_TASK,
{ _class: tracker.class.Issue, startDate: { $exists: false } },
{ startDate: null }
)
})

it('sets startDate=null on every Milestone lacking the field (DOMAIN_TRACKER)', async () => {
const update = jest.fn().mockResolvedValue(undefined)
const client: any = { update }

await migrateAddStartDate(client)

expect(update).toHaveBeenCalledWith(
DOMAIN_TRACKER,
{ _class: tracker.class.Milestone, startDate: { $exists: false } },
{ startDate: null }
)
})

it('issues exactly two update calls (one per class)', async () => {
const update = jest.fn().mockResolvedValue(undefined)
const client: any = { update }

await migrateAddStartDate(client)

expect(update).toHaveBeenCalledTimes(2)
})
})
35 changes: 34 additions & 1 deletion models/tracker/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ import {
TClassicProjectTypeData,
TComponent,
TIssue,
TIssueRelation,
TIssueStatus,
TIssueTemplate,
TIssueTypeData,
Expand Down Expand Up @@ -195,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 @@ -441,6 +444,7 @@ export function createModel (builder: Builder): void {
TProject,
TComponent,
TIssue,
TIssueRelation,
TIssueTemplate,
TIssueStatus,
TTypeIssuePriority,
Expand Down Expand Up @@ -594,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
151 changes: 150 additions & 1 deletion models/tracker/src/migration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,15 +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 @@ -170,6 +175,54 @@ async function migrateIdentifiers (client: MigrationClient): Promise<void> {
}
}

export async function migrateAddStartDate (client: MigrationClient): Promise<void> {
// Issues live in DOMAIN_TASK; Milestones live in DOMAIN_TRACKER.
await client.update(
DOMAIN_TASK,
{ _class: tracker.class.Issue, startDate: { $exists: false } },
{ startDate: null }
)
await client.update(
DOMAIN_TRACKER,
{ _class: tracker.class.Milestone, startDate: { $exists: false } },
{ startDate: null }
)
}

// 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 @@ -364,6 +417,77 @@ 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 !== undefined &&
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 @@ -398,6 +522,27 @@ export const trackerOperation: MigrateOperation = {
state: 'migrateDefaultTypeMixins',
mode: 'upgrade',
func: migrateDefaultTypeMixins
},
{
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 @@ -409,6 +554,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
Loading