Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
335 commits
Select commit Hold shift + click to select a range
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
a58902a
feat(tracker-resources): add sidebar-virtualization range helper for …
MichaelUray May 15, 2026
0aa55af
deps(tracker-resources): add @tanstack/svelte-virtual for Gantt Y-axi…
MichaelUray May 15, 2026
1c57405
feat(tracker-resources): add y-viewport manager for Gantt vertical vi…
MichaelUray May 15, 2026
24f85fa
feat(tracker-resources): classify dependency-arrow visibility against…
MichaelUray May 15, 2026
a7db4d3
test(tracker-resources): add 1000+5000-row y-viewport perf gates
MichaelUray May 15, 2026
4a6163e
chore(tracker-resources): remove dead Gantt lib files (filter-predica…
MichaelUray May 15, 2026
818747c
chore(tracker-resources): scrub internal tier/version markers from in…
MichaelUray May 15, 2026
ec25eed
style(tracker-resources): apply prettier formatting in tier3
MichaelUray Jul 3, 2026
9d5a2be
chore(tracker): reconcile Gantt test source after develop rebase
MichaelUray Jul 9, 2026
d4c0a3e
build: refresh pnpm-lock.yaml for rebased dependency set
MichaelUray Jul 9, 2026
483e2e3
feat(tracker-resources): add per-project tree expand-state store back…
MichaelUray May 15, 2026
dcb1be8
docs(gantt): clarify cascade-token JSDoc with v1 dependency-shift wiring
MichaelUray May 15, 2026
0b01e82
feat(tracker): Predecessors column in Tracker list view
MichaelUray May 15, 2026
35b5e55
feat(tracker-resources): add cascade-shift bundle aggregator with gro…
MichaelUray May 15, 2026
ecb3532
feat(tracker-resources): add DependencyShiftedPresenter for inbox bun…
MichaelUray May 15, 2026
02ef04c
i18n(tracker): add DependencyShifted notification strings (en + de)
MichaelUray May 15, 2026
6e4c18d
i18n(tracker): add DependencyKindHint*, DependencyPickKind, Dependenc…
MichaelUray May 15, 2026
93e6ee5
feat(tracker-resources): Visual DependencyEditor with 2x2 mini-diagra…
MichaelUray May 15, 2026
f759321
feat(models/tracker): register DependencyShiftedNotification class an…
MichaelUray May 15, 2026
7e4f305
feat(tracker-resources): add diagram-helpers for Visual DependencyEditor
MichaelUray May 15, 2026
7bf258f
fix(tracker-resources): touch-action: none on bars + drawer header of…
MichaelUray May 15, 2026
38b4e66
feat(tracker-resources): mobile drawer + responsive confirm popup
MichaelUray May 15, 2026
cb949dc
test(tracker-resources): cover three previously-untested gantt lib files
MichaelUray May 15, 2026
4a4a2bb
chore(tracker-resources): scrub internal tier/version markers from in…
MichaelUray May 15, 2026
0bc8199
feat(tracker-resources): hoist gantt toolbar into SpaceHeader row 2
MichaelUray May 16, 2026
2fd2ee5
fix(tracker-resources): correct visual order of merged gantt toolbar
MichaelUray May 16, 2026
5fbfb5a
feat: global Fullscreen toggle + Lupe-first toolbar + milestone label…
MichaelUray May 16, 2026
cdb19f2
fix(tracker-resources): resolve eslint errors in tier4
MichaelUray Jul 3, 2026
68d607b
style(tracker-resources): prettier reflow of tier4 block bodies
MichaelUray Jul 3, 2026
fcaf5ae
chore(tracker): reconcile Gantt sources + ru.json after develop rebase
MichaelUray Jul 9, 2026
9a7e48c
fix(fulltext): bump model version to 0.7.423 to match deployed worksp…
MichaelUray May 17, 2026
6081f37
feat(ui+gantt): rightmost fullscreen + jump-to-start/end icons + max-…
MichaelUray May 17, 2026
66547be
refactor(view-resources): extract makeFilterQuery + fix FilterButton …
MichaelUray May 17, 2026
b747116
feat(view-resources): inline filter chips with overflow popover
MichaelUray May 17, 2026
40e06e5
refactor(gantt): drop duplicate corner-range date-nav, keep collapse/…
MichaelUray May 17, 2026
345994d
feat(ui): IModeSelector.disabled + relocate ModeSelector left of Filter
MichaelUray May 17, 2026
ff6b0df
feat(tracker): customize-view toggles for ModeSelector + searchScope …
MichaelUray May 17, 2026
b66ada6
feat(search): SearchInputAdvanced with prefix-operators + ES query_st…
MichaelUray May 17, 2026
79bb6aa
feat(tracker): empty-state card for zero search results
MichaelUray May 17, 2026
eaa6add
feat(tracker): match-highlight in list + gantt sidebar titles
MichaelUray May 17, 2026
bf303c7
fix(tracker): drop .issuesview-content wrapper that broke Gantt initi…
MichaelUray May 17, 2026
a4b5111
fix(filter): InlineFilterChips chip-render and live-verification foll…
MichaelUray May 17, 2026
10aa57d
fix(tracker): address code-review blockers + Codex follow-ups
MichaelUray May 18, 2026
773ed4e
fix(tracker+ui+gantt): three search-state and saved-view findings
MichaelUray May 20, 2026
a40b0e2
fix(ui): escape colons inside prefix values + orphan-colon tokens
MichaelUray May 20, 2026
6454698
fix(ui): broaden orphan-token escaping in prefix-routed queries
MichaelUray May 20, 2026
5f1fe8b
fix(ui): capture attached parens as part of prefix value
MichaelUray May 20, 2026
53b2d31
refactor(ui): replace 2-pass regex encoder with typed tokenizer
MichaelUray May 20, 2026
b48100b
fix(ui): escape leading hyphen in prefix-routed search tokens
MichaelUray May 20, 2026
816183d
chore(ui): neutralize internal review markers in search-encoder tests
MichaelUray May 20, 2026
4de0e6f
fix(tracker-resources+ui): resolve eslint errors in filter-search-red…
MichaelUray Jul 3, 2026
4810689
fix(view-resources): resolve eslint errors in query-builder test
MichaelUray Jul 3, 2026
274c3a7
chore: apply repo formatting after cascade merge
MichaelUray Jul 3, 2026
f0d1ce9
chore(tracker): reconcile Gantt sources + ru.json after develop rebase
MichaelUray Jul 9, 2026
b208b01
fix(tracker-resources): remove redundant type modifiers in GanttView …
MichaelUray Jul 9, 2026
b9df9ef
fix: resolve formatting-job failures on filter-search-redesign
MichaelUray Jul 9, 2026
6d417d8
revert: restore importer.ts !success checks to develop form
MichaelUray Jul 9, 2026
d057ab7
fix(view,tracker): repair filter E2E regressions from filter-search r…
MichaelUray Jul 9, 2026
a05e97e
fix(ui): re-sync SearchInputAdvanced only when the parent prop changes
MichaelUray Jul 12, 2026
94bafa4
Merge upstream/develop into feat/tracker-filter-search-redesign
MichaelUray Jul 12, 2026
3967deb
test(tracker): scope orderingButton to the Order-by control
MichaelUray Jul 12, 2026
1ad545a
fix(tracker): let shouldShowAll keep empty groups visible on a zero-h…
MichaelUray Jul 13, 2026
8b763b1
test(tracker): scope issue-presence check to the result link
MichaelUray Jul 13, 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
162 changes: 161 additions & 1 deletion common/config/rush/pnpm-lock.yaml

Large diffs are not rendered by default.

45 changes: 37 additions & 8 deletions foundations/server/packages/elastic/src/adapter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -314,17 +314,46 @@ class ElasticAdapter implements FullTextAdapter {
from: number | undefined
): Promise<IndexedDoc[]> {
if (query.$search === undefined) return []
const raw = String(query.$search)
// Route field-targeted queries (e.g. `searchTitle:value`, `identifier:HULY-`,
// `comments.message:foo`) through `query_string` so ES can parse the
// field-targeted clauses and apply per-field boosts. Restrict the
// detector to the set of fields we actually index — typing a bare colon
// such as `POC: design review` or a URL must NOT silently route to
// `query_string` (which would throw a parsing exception and surface as
// zero hits). Anything else falls back to `simple_query_string` for full
// backwards compatibility.
const KNOWN_FIELD_RE =
/(^|\s)(searchTitle|searchShortTitle|identifier|description\.plain|comments\.message|fulltextSummary)\s*:/i
const usesQueryString = KNOWN_FIELD_RE.test(raw)
const queryBlock: any = usesQueryString
? {
query_string: {
query: raw,
fields: [
'searchTitle^3',
'searchShortTitle^2',
'identifier^2',
'description.plain',
'comments.message^0.7',
'fulltextSummary'
],
default_operator: 'AND',
allow_leading_wildcard: false
}
}
: {
simple_query_string: {
query: raw,
analyze_wildcard: true,
flags: 'OR|PREFIX|PHRASE|FUZZY|NOT|ESCAPE',
default_operator: 'and'
}
}
const request: any = {
bool: {
must: [
{
simple_query_string: {
query: query.$search,
analyze_wildcard: true,
flags: 'OR|PREFIX|PHRASE|FUZZY|NOT|ESCAPE',
default_operator: 'and'
}
},
queryBlock,
{
term: {
workspaceId
Expand Down
65 changes: 63 additions & 2 deletions models/tracker/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ import {
DOMAIN_TRACKER,
TClassicProjectTypeData,
TComponent,
TDependencyShiftedNotification,
TIssue,
TIssueRelation,
TIssueStatus,
Expand Down Expand Up @@ -161,6 +162,34 @@ function defineNotifications (builder: Builder): void {
tracker.ids.AssigneeNotification
)

// — Notification on Dependency-Shift.
// The cascade bundle is created client-side as a CommonInboxNotification
// subclass (see `dependency-shift-send.ts`); this NotificationType wires it
// into the user's tracker notification group so settings/Inbox provider
// routing work the same as the assignee type. `field` is bound to the
// `cascadeToken` attribute so the auto-`dueDate` generated type stays
// distinct (and they don't compete on the same `dueDate` notify channel).
builder.createDoc(
notification.class.NotificationType,
core.space.Model,
{
hidden: false,
generated: false,
label: tracker.string.DependencyShifted,
group: tracker.ids.TrackerNotificationGroup,
field: 'cascadeToken',
txClasses: [core.class.TxCreateDoc],
objectClass: tracker.class.DependencyShiftedNotification,
templates: {
textTemplate: '{sender} shifted {trigger} — {count} dependent issues moved',
htmlTemplate: '<p>{sender} shifted {trigger} — {count} dependent issues moved</p>',
subjectTemplate: 'Dependency shift'
},
defaultEnabled: true
},
tracker.ids.DependencyShiftedNotification
)

generateClassNotificationTypes(
builder,
tracker.class.Issue,
Expand Down Expand Up @@ -196,7 +225,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 @@ -453,7 +484,8 @@ export function createModel (builder: Builder): void {
TRelatedIssueTarget,
TTypeEstimation,
TTypeRemainingTime,
TProjectTargetPreference
TProjectTargetPreference,
TDependencyShiftedNotification
)

builder.mixin(tracker.class.Project, core.class.Class, activity.mixin.ActivityDoc, {})
Expand Down Expand Up @@ -596,6 +628,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
3 changes: 3 additions & 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 All @@ -79,6 +80,8 @@ export default mergeIds(trackerId, tracker, {
ids: {
TrackerNotificationGroup: '' as Ref<NotificationGroup>,
AssigneeNotification: '' as Ref<NotificationType>,
// — Notification on Dependency-Shift.
DependencyShiftedNotification: '' as Ref<NotificationType>,
BaseProjectType: '' as Ref<ProjectType>,
GuestIssueClassPermission: '' as Ref<Doc>,
ModulePermissionGroup: '' as Ref<Doc>,
Expand Down
16 changes: 16 additions & 0 deletions models/tracker/src/presenters.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,22 @@ 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
})

//
// — Dependency-Shift bundle notification renderer.
//
builder.mixin(tracker.class.DependencyShiftedNotification, core.class.Class, view.mixin.ObjectPresenter, {
presenter: tracker.component.DependencyShiftedPresenter
})

builder.mixin(tracker.class.Issue, core.class.Class, view.mixin.PreviewPresenter, {
presenter: tracker.component.IssuePreview
})
Expand Down
Loading