Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
389 commits
Select commit Hold shift + click to select a range
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
7795b0d
fix(gantt): bump contrast on Todo + Cancelled status bars
MichaelUray May 20, 2026
56654a0
feat(gantt): add GanttBarIssueLike type + isPastDue/isBlocked predicates
MichaelUray May 20, 2026
bf84420
feat(tracker): add optional color field to Component and Milestone
MichaelUray May 20, 2026
1c7112c
feat(tracker-resources): ColorsPopup swatch in EditComponent + EditMi…
MichaelUray May 20, 2026
2154484
feat(gantt): add pure bar-color resolver for 6 color modes
MichaelUray May 20, 2026
5342f55
feat(gantt): extend GanttSavedViewOptions with 4 new toolbar fields
MichaelUray May 20, 2026
7d09d01
feat(gantt): wire bar-color resolver into GanttView + GanttBar
MichaelUray May 20, 2026
f36373d
feat(gantt): render Past-due stripe + Blocked hatch overlays
MichaelUray May 20, 2026
2f74bf0
feat(gantt): sub-issue progress fill (Status-mode only)
MichaelUray May 20, 2026
7d10382
feat(gantt): toolbar Color-by dropdown with 6 modes
MichaelUray May 20, 2026
9756750
feat(gantt): persist bar-color toolbar state in saved views
MichaelUray May 20, 2026
ebcd322
feat(gantt): expose overlay + progress toggles in ganttViewOptions
MichaelUray May 20, 2026
1e8ce11
fix(gantt): lighten canvas background
MichaelUray May 20, 2026
b2fb7db
fix(fulltext): bump model version to 0.7.423 to match deployed worksp…
MichaelUray May 17, 2026
885ff1c
feat(ui+gantt): rightmost fullscreen + jump-to-start/end icons + max-…
MichaelUray May 17, 2026
f969fd7
refactor(view-resources): extract makeFilterQuery + fix FilterButton …
MichaelUray May 17, 2026
17a0513
feat(view-resources): inline filter chips with overflow popover
MichaelUray May 17, 2026
852d906
refactor(gantt): drop duplicate corner-range date-nav, keep collapse/…
MichaelUray May 17, 2026
251e665
feat(ui): IModeSelector.disabled + relocate ModeSelector left of Filter
MichaelUray May 17, 2026
e0f79d4
feat(tracker): customize-view toggles for ModeSelector + searchScope …
MichaelUray May 17, 2026
59f380b
feat(search): SearchInputAdvanced with prefix-operators + ES query_st…
MichaelUray May 17, 2026
262b057
feat(tracker): empty-state card for zero search results
MichaelUray May 17, 2026
ad300a9
feat(tracker): match-highlight in list + gantt sidebar titles
MichaelUray May 17, 2026
8554f3d
fix(tracker): drop .issuesview-content wrapper that broke Gantt initi…
MichaelUray May 17, 2026
01ec906
fix(filter): InlineFilterChips chip-render and live-verification foll…
MichaelUray May 17, 2026
005ac20
fix(tracker): address code-review blockers + Codex follow-ups
MichaelUray May 18, 2026
15f2443
fix(gantt): compact Group-by + Color-by toolbar dropdowns
MichaelUray May 20, 2026
2293416
fix(gantt): shorten GanttColorByNone + cap select intrinsic width
MichaelUray May 20, 2026
f8b17fc
fix(tracker+ui+gantt): three Codex Round-5 findings
MichaelUray May 20, 2026
8b893b2
fix(ui): escape colons inside prefix values + orphan-colon tokens
MichaelUray May 20, 2026
28c768a
fix(ui): broaden orphan-token escaping in prefix-routed queries
MichaelUray May 20, 2026
8042fb7
fix(ui): capture attached parens as part of prefix value
MichaelUray May 20, 2026
ecdf2a5
refactor(ui): replace 2-pass regex encoder with typed tokenizer
MichaelUray May 20, 2026
b0d9748
fix(ui): escape leading hyphen in prefix-routed search tokens
MichaelUray May 20, 2026
e51788b
chore(ui): neutralize internal review markers in search-encoder tests
MichaelUray May 20, 2026
9a2dc04
fix(tracker-resources): restore union imports after bar-colors cascad…
MichaelUray Jul 3, 2026
076c557
chore: apply repo formatting after cascade merge
MichaelUray Jul 3, 2026
bb10d87
Fix publish npm (#10950)
ArtyomSavchenko Jul 3, 2026
44a6fd5
Revert "Fix publish npm (#10950)" (#10951)
ArtyomSavchenko Jul 3, 2026
47fcae5
fix(ui): resolve eslint error in SearchInputAdvanced surfaced by gant…
MichaelUray Jul 4, 2026
81c3c6f
fix(tracker): resolve eslint errors in gantt bar-colors (non-null ass…
MichaelUray Jul 4, 2026
b49f0c1
style(view-resources): normalize filter-search formatting (prettier +…
MichaelUray Jul 4, 2026
55a2aac
style(tracker,view): normalize formatting for filter-search + gantt (…
MichaelUray Jul 4, 2026
3d50d86
fix(view-resources): restore Clear-all filter button for non-tracker …
MichaelUray Jul 6, 2026
0d19a4f
fix(view-resources): scope chip overflow-collapse to the Gantt toolba…
MichaelUray Jul 6, 2026
0909d6f
fix(view-resources): drop misapplied .ordering class from generic vie…
MichaelUray Jul 6, 2026
88096f0
fix(tracker): stop empty-state display:none from hiding virtualized i…
MichaelUray Jul 6, 2026
1375ad0
fix(view-resources): restore refresh callback so async filter results…
MichaelUray Jul 6, 2026
1b7f302
fix(ui): stop SearchInputAdvanced clobbering user input on every keys…
MichaelUray Jul 7, 2026
ff1c466
fix(ui): encoder handles spaced/mixed-case field prefixes and boolean…
MichaelUray Jul 8, 2026
bc91d85
fix(view): stable overflow measurement for filter chips
MichaelUray Jul 8, 2026
b569f4f
test(tracker): retry-poll issue search to tolerate $search index lag
MichaelUray Jul 8, 2026
79c1773
Revert "test(tracker): retry-poll issue search to tolerate $search in…
MichaelUray Jul 8, 2026
a1ca716
fix(tracker): relation-activity migration reads DOMAIN_TX not model_t…
MichaelUray Jul 8, 2026
cfabc8d
feat(tracker): DependencyShiftRequest model + shared groupShiftsByRec…
MichaelUray Jul 8, 2026
0267366
feat(server-tracker): OnDependencyShiftRequest trigger — server-side …
MichaelUray Jul 8, 2026
bc7fdeb
refactor(gantt): client emits shift-request doc, no cross-PersonSpace…
MichaelUray Jul 8, 2026
8b21699
fix(test): cast notif to resolve TS build error in dependency-shift-t…
MichaelUray Jul 8, 2026
8b2763c
test(tracker): rewrite dependency-shift-send test for request-doc sem…
MichaelUray Jul 8, 2026
1ee6c03
test(tracker): assert on issue rows, not panel text, in checkIssuePre…
MichaelUray Jul 8, 2026
45069ce
fix(view): close filter-overflow popover on filter-set change (no sta…
MichaelUray Jul 8, 2026
a81d618
docs(elastic): document why query_string field-targeting is space-ACL…
MichaelUray Jul 8, 2026
7690401
fix(gantt): normalize issue dates to UTC-midnight at the data boundar…
MichaelUray Jul 8, 2026
75cb1d2
fix(gantt): render left bar-label slot (M-G2)
MichaelUray Jul 8, 2026
35d3d98
fix(gantt): inside-label guard checks insideLabel (M-G3)
MichaelUray Jul 8, 2026
4c3d78e
fix(tracker): kanban result-count from live callback, no stale coupli…
MichaelUray Jul 8, 2026
0368fd0
fix(gantt): hard-filter layout keeps matching descendants of non-matc…
MichaelUray Jul 8, 2026
b83d9a7
fix(tracker): unsubscribe predecessor queries when emptied (M-G6)
MichaelUray Jul 8, 2026
5be884e
fix(tracker): guard dependency-panel resolve against out-of-order res…
MichaelUray Jul 8, 2026
2b58efa
style(tracker): fast-format normalize layout.ts (M-G5)
MichaelUray Jul 8, 2026
dbfae08
perf(gantt): O(1) issue lookup in critical-path passes (M-G10)
MichaelUray Jul 8, 2026
e536f56
perf(gantt): scope person query to referenced assignees (M-G8)
MichaelUray Jul 8, 2026
8b19827
perf(gantt): project drag-commit space fetch + batch guest permission…
MichaelUray Jul 8, 2026
a81df7c
fix(gantt): critical-path cycle check runs on scheduled relations onl…
MichaelUray Jul 8, 2026
2634873
fix(gantt): client-side hardening — async guard, key guards, undo DI …
MichaelUray Jul 8, 2026
ea9c92b
docs(tracker): correct SearchEmptyState wording — search text is not …
MichaelUray Jul 8, 2026
17cb548
fix(tracker): clamp milestone start/target so the range never inverts…
MichaelUray Jul 8, 2026
8555123
docs(tracker): clarify canEditMilestone is a guest-role gate only (L-G7)
MichaelUray Jul 8, 2026
90def7a
fix(tracker): migrate search view options into List/Kanban viewlets (…
MichaelUray Jul 8, 2026
c6fd4cd
fix(view): filter mutators emit fresh arrays instead of in-place muta…
MichaelUray Jul 8, 2026
f78db17
fix(view): re-arm List queryReady only on query content change (L-VF2)
MichaelUray Jul 8, 2026
ee90267
fix(ui): highlight each query term and strip stacked prefixes (L-VF3)
MichaelUray Jul 8, 2026
d54d4f8
fix(view): bind filter-overflow badge aria-expanded to popover state …
MichaelUray Jul 8, 2026
63dea5e
fix(view): intersect $lte/$gte date bounds when merging filters (L-VF7)
MichaelUray Jul 8, 2026
7702a05
chore(tracker): reconcile Gantt sources + ru.json after develop rebase
MichaelUray Jul 9, 2026
0e7e800
Merge remote-tracking branch 'upstream/develop' into feat/gantt-bar-c…
MichaelUray Jul 10, 2026
23b32b4
fix(view): apply #10969 filtered-view visibility gate to the Tracker …
MichaelUray Jul 10, 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.

70 changes: 62 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,71 @@ 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.
// KEEP IN SYNC with packages/ui SearchInputAdvanced.encoder.ts
// ES_NATIVE_FIELDS (and vice versa). The client only emits a `field:value`
// clause for a field it believes the server recognises; if the two lists
// drift, a client-routed clause hits a field the adapter does not treat as
// query_string and silently fails to parse.
//
// SECURITY (M-VF5): `query_string` lets a raw `field:value` clause target
// ANY indexed field (e.g. `space:<id>`, `modifiedBy:<id>`, `attachedTo:<id>`),
// not just the `fields` whitelist below (that list only picks the DEFAULT
// fields for bare terms). This is intentionally NOT gated here because the
// hits this method returns are never authoritative results — they are only a
// candidate id-set. The two enclosing guards make field-targeting safe:
// 1. `workspaceId` is a hard `bool.must` term (see the request below), so
// no clause can reach another workspace's documents.
// 2. Within the workspace, every consumer re-filters by space ACL. The
// only caller is pods/fulltext `/api/v1/search` → FullTextMiddleware,
// which sits BELOW SpaceSecurityMiddleware in the pipeline. That
// middleware runs `provideFindAll({ _id: { $in: <these ids> }, ...q })`
// where `q` still carries the space constraint SpaceSecurityMiddleware
// injected upstream (or, in its >85%-allowed fast path, post-filters
// the result via `clientFilterSpaces`). A forbidden-space doc surfaced
// by a crafted `space:` clause is therefore dropped at the DB findAll /
// result filter and never reaches the client — no content or existence
// oracle. Verified 2026-07-07 against server-pipeline middleware order.
//
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
8 changes: 8 additions & 0 deletions models/server-tracker/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,14 @@ export function createModel (builder: Builder): void {
}
})

builder.createDoc(serverCore.class.Trigger, core.space.Model, {
trigger: serverTracker.trigger.OnDependencyShiftRequest,
txMatch: {
_class: core.class.TxCreateDoc,
objectClass: tracker.class.DependencyShiftRequest
}
})

builder.mixin(
tracker.ids.AssigneeNotification,
notification.class.NotificationType,
Expand Down
24 changes: 23 additions & 1 deletion models/tracker/src/__tests__/migration.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,12 @@
// you may not use this file except in compliance with the License.
//

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

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

describe('migrateAddStartDate', () => {
it('sets startDate=null on every Issue lacking the field (DOMAIN_TASK)', async () => {
Expand Down Expand Up @@ -47,3 +48,24 @@ describe('migrateAddStartDate', () => {
expect(update).toHaveBeenCalledTimes(2)
})
})

describe('migrateRelationActivityAttachment', () => {
it('looks up the relation create-tx in DOMAIN_TX (not DOMAIN_MODEL_TX)', async () => {
const findDomains: string[] = []
const client: any = {
find: jest.fn(async (domain: string, q: any) => {
findDomains.push(domain)
// one broken remove-DUM on the first (DOMAIN_ACTIVITY) call:
if (domain === 'activity') {
return [{ _id: 'dum1', objectId: 'rel1', attachedToClass: 'x', updateCollection: undefined }]
}
return [] // tx lookup returns empty regardless of domain
}),
update: jest.fn(async () => undefined)
}
await migrateRelationActivityAttachment(client)
// The create-tx lookup MUST hit DOMAIN_TX, never DOMAIN_MODEL_TX.
expect(findDomains).toContain(DOMAIN_TX)
expect(findDomains).not.toContain('model_tx')
})
})
67 changes: 65 additions & 2 deletions models/tracker/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ import {
DOMAIN_TRACKER,
TClassicProjectTypeData,
TComponent,
TDependencyShiftedNotification,
TDependencyShiftRequest,
TIssue,
TIssueRelation,
TIssueStatus,
Expand Down Expand Up @@ -161,6 +163,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 +226,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 +485,9 @@ export function createModel (builder: Builder): void {
TRelatedIssueTarget,
TTypeEstimation,
TTypeRemainingTime,
TProjectTargetPreference
TProjectTargetPreference,
TDependencyShiftedNotification,
TDependencyShiftRequest
)

builder.mixin(tracker.class.Project, core.class.Class, activity.mixin.ActivityDoc, {})
Expand Down Expand Up @@ -596,6 +630,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
Loading