Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
62 commits
Select commit Hold shift + click to select a range
0e87184
feat(tracker): register Gantt view tab (placeholder UI)
MichaelUray May 15, 2026
4868b15
feat(tracker-resources): add Gantt lib types
MichaelUray May 15, 2026
5399bf6
test(tracker-resources): add failing Gantt time-scale tests
MichaelUray May 15, 2026
de2652e
feat(tracker-resources): implement Gantt time-scale lib
MichaelUray May 15, 2026
1ba2a15
test(tracker-resources): add failing Gantt layout tests
MichaelUray May 15, 2026
4ef672f
feat(tracker-resources): implement Gantt layout lib
MichaelUray May 15, 2026
e7e0472
feat(tracker-resources): add GanttHeader.svelte
MichaelUray May 15, 2026
2173ab4
feat(tracker-resources): add GanttBar.svelte (regular + summary claws)
MichaelUray May 15, 2026
af2d60a
feat(tracker-resources): add GanttTodayMarker.svelte
MichaelUray May 15, 2026
84355bd
feat(tracker-resources): add GanttMilestoneFlag.svelte
MichaelUray May 15, 2026
cc37678
feat(tracker-resources): add GanttCanvas.svelte
MichaelUray May 15, 2026
528eac4
feat(tracker-resources): add GanttSidebar.svelte
MichaelUray May 15, 2026
d257021
feat(tracker-resources): add GanttToolbar.svelte (zoom buttons)
MichaelUray May 15, 2026
1dfac46
feat(tracker-resources): GanttView wires Sidebar+Canvas+Toolbar with …
MichaelUray May 15, 2026
787f2ae
- layout.ts: orphan child issues (parent filtered out) now emit as roots
MichaelUray May 15, 2026
d100e2a
Toolbar (replaces previous floating zoom):
MichaelUray May 15, 2026
0f43f8f
- SVG horizontal-scroll bug: GanttHeader and GanttCanvas now render at
MichaelUray May 15, 2026
295d1bd
feat(tracker-resources): wire Gantt sidebar toggles into Customize-View
MichaelUray May 15, 2026
8cbe5a0
fix(tracker-resources): clip GanttSidebar inside its host
MichaelUray May 15, 2026
6eda168
fix(tracker-resources): unified Gantt scroll container (Plane-style s…
MichaelUray May 15, 2026
c307059
feat(tracker-resources): + New issue button in Gantt toolbar
MichaelUray May 15, 2026
2d8e4e6
chore(tracker): localize Gantt UI strings + minimize locale diffs
MichaelUray May 15, 2026
c5a65dc
feat(tracker-resources): blue plus-only NewIssueHeader
MichaelUray May 15, 2026
44b8797
fix(tracker-resources): resize handle no longer fights canvas pan
MichaelUray May 15, 2026
b2582fc
feat(tracker-resources): sticky-bottom horizontal scrollbar (Plane-st…
MichaelUray May 15, 2026
f1cd1a2
feat(tracker-resources): custom DOM scrollbar thumb (visible everywhere)
MichaelUray May 15, 2026
3d5ea84
feat(tracker-resources): hardened scrollbars + status colors + tight …
MichaelUray May 15, 2026
3bd0761
feat(tracker-resources): status badge column + ganttShowStatus toggle
MichaelUray May 15, 2026
fa36024
feat(tracker-resources): Tracker UI redesign polish v27
MichaelUray May 15, 2026
619b9a2
feat(tracker-resources): inline-add row in Gantt sidebar (PR2.1)
MichaelUray May 15, 2026
61c8df3
feat(model-tracker): register startDate + dueDate as Issue filters
MichaelUray May 15, 2026
27f29b5
fix(tracker-resources): hide Gantt h-scrollbar when there's no overflow
MichaelUray May 15, 2026
0911bb0
chore(tracker-resources): remove internal review markers from inline …
MichaelUray May 15, 2026
614929d
fix(tracker-resources): resolve eslint errors in gantt read-only comp…
MichaelUray Jul 3, 2026
6760882
chore(tracker-resources): apply prettier formatting after develop merge
MichaelUray Jul 3, 2026
08edbc5
feat(tracker-resources): Gantt drag/resize state types
MichaelUray May 15, 2026
3b41142
feat(tracker-resources): drag-controller reducer skeleton + idle tran…
MichaelUray May 15, 2026
5f363ef
feat(tracker-resources): drag-controller — body drag transitions
MichaelUray May 15, 2026
1a84628
feat(tracker-resources): drag-controller — resize-left/right with cla…
MichaelUray May 15, 2026
cd3100b
feat(tracker-resources): scheduler.descendantsWithDates (cycle-safe BFS)
MichaelUray May 15, 2026
456157f
feat(tracker): i18n keys for Gantt edit-mode (set-start-date + 5 toas…
MichaelUray May 15, 2026
ad50211
feat(tracker-resources): local Set-start-date action for Gantt menu
MichaelUray May 15, 2026
7fcdd8d
feat(tracker-resources): GanttView activeDrag store + per-issue edit …
MichaelUray May 15, 2026
9d7ae72
feat(tracker-resources): GanttBar edge-detect + resize-handle hit areas
MichaelUray May 15, 2026
e70801a
feat(tracker-resources): GanttCanvas forwards bar events + mounts res…
MichaelUray May 15, 2026
631accc
feat(tracker-resources): wire drag reducer + atomic commitDrag in Gan…
MichaelUray May 15, 2026
7ea1282
feat(tracker-resources): active-drag preview geometry + tint on GanttBar
MichaelUray May 15, 2026
0eba227
feat(tracker-resources): right-click context menu on bar + sidebar row
MichaelUray May 15, 2026
18e0ac2
feat(tracker-resources): keyboard Tab cycle + arrow-shift for Gantt bars
MichaelUray May 15, 2026
9b8e3da
feat(tracker-resources): dim non-active rows during drag (spotlight f…
MichaelUray May 15, 2026
f82c534
feat(tracker-resources): drag-from-unscheduled — drop on canvas sets …
MichaelUray May 15, 2026
c4fd5b0
fix(tracker-resources): allow direct idle → drag in reducer
MichaelUray May 15, 2026
a79ef05
feat(tracker-resources): slim Gantt context menu + fix pan-grip colli…
MichaelUray May 15, 2026
5887db0
fix(tracker-resources): Gantt menu — deny-list + restore Open/Parent/…
MichaelUray May 15, 2026
778c31f
feat(tracker): Gantt Hierarchy submenu + EditIssue parent + header su…
MichaelUray May 15, 2026
e0d9db0
feat(tracker-resources): Gantt select-first drag + confirm popup + su…
MichaelUray May 15, 2026
59097e9
fix(tracker-resources): Gantt parent-drag truth source + canvasX offs…
MichaelUray May 15, 2026
ba40985
chore(tracker-resources): Gantt polish — drop stale CSS, i18n ARIA la…
MichaelUray May 15, 2026
9c93a08
chore(tracker-resources): remove internal review markers from inline …
MichaelUray May 15, 2026
b64ac3b
fix(tracker-resources): resolve eslint errors in gantt edit components
MichaelUray Jul 3, 2026
69f295f
chore(tracker-resources): apply prettier formatting after develop merge
MichaelUray Jul 3, 2026
4e1b0f9
i18n(tracker-assets): sync ru.json keys with en.json (gantt pr3a)
MichaelUray Jul 3, 2026
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
4 changes: 3 additions & 1 deletion models/tracker/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,9 @@ function defineFilters (builder: Builder): void {
key: 'milestone',
component: view.component.ObjectFilter,
showNested: false
}
},
'startDate',
'dueDate'
],
ignoreKeys: ['number', 'estimation', 'attachedTo'],
getVisibleFilters: tracker.function.GetVisibleFilters
Expand Down
97 changes: 97 additions & 0 deletions models/tracker/src/viewlets.ts
Original file line number Diff line number Diff line change
Expand Up @@ -212,6 +212,75 @@ export function issueConfig (
]
}

export function ganttViewOptions (): ViewOptionsModel {
// PR 2 ships a minimal read-only Gantt. Group-by + Show-colors are
// intentionally NOT advertised — the canvas does not honour them yet.
// The two sidebar-column toggles below ARE wired up to GanttSidebar.
return {
groupBy: [],
orderBy: [
['startDate', SortingOrder.Ascending],
['rank', SortingOrder.Ascending],
['dueDate', SortingOrder.Ascending]
],
other: [
{
key: 'ganttShowIssueCode',
type: 'toggle',
defaultValue: false,
actionTarget: 'display',
label: tracker.string.GanttShowIssueCode
},
{
key: 'ganttShowTitle',
type: 'toggle',
defaultValue: true,
actionTarget: 'display',
label: tracker.string.GanttShowTitle
},
{
key: 'ganttShowStatus',
type: 'toggle',
defaultValue: true,
actionTarget: 'display',
label: tracker.string.GanttShowStatus
},
{
// Default-on safety prompt: when set, dragging an issue's bar to a
// new date range shows a confirm dialog before writing the change.
// User feedback 2026-05-11: easy to misclick a bar while panning,
// and a one-click confirm prevents accidental schedule edits.
key: 'ganttConfirmMove',
type: 'toggle',
defaultValue: true,
actionTarget: 'display',
label: tracker.string.GanttConfirmMove
},
{
// Same idea but for left/right resize handles.
key: 'ganttConfirmResize',
type: 'toggle',
defaultValue: true,
actionTarget: 'display',
label: tracker.string.GanttConfirmResize
}
]
}
}

export function ganttConfig (): BuildModelKey[] {
// Minimal config — Gantt drives its own column layout.
return [
{
key: '',
presenter: tracker.component.PriorityEditor,
label: tracker.string.Priority,
props: { kind: 'list', size: 'small' }
},
{ key: '', presenter: tracker.component.IssuePresenter, label: tracker.string.Issue }
]
}

export function defineViewlets (builder: Builder): void {
builder.createDoc(
view.class.ViewletDescriptor,
Expand All @@ -224,6 +293,17 @@ export function defineViewlets (builder: Builder): void {
tracker.viewlet.Kanban
)

builder.createDoc(
view.class.ViewletDescriptor,
core.space.Model,
{
label: tracker.string.Gantt,
icon: tracker.icon.Gantt,
component: tracker.component.GanttView
},
tracker.viewlet.Gantt
)

builder.createDoc(
view.class.Viewlet,
core.space.Model,
Expand Down Expand Up @@ -501,6 +581,23 @@ export function defineViewlets (builder: Builder): void {
tracker.viewlet.IssueKanban
)

// Gantt is registered AFTER List + Kanban so List remains the default
// viewlet (ViewletSelector falls back to viewlets[0] when no preference
// is saved). Putting Gantt last avoids surprising users with an empty
// canvas on first visit.
builder.createDoc(
view.class.Viewlet,
core.space.Model,
{
attachTo: tracker.class.Issue,
descriptor: tracker.viewlet.Gantt,
viewOptions: ganttViewOptions(),
configOptions: { strict: true, hiddenKeys: ['title'] },
config: ganttConfig()
},
tracker.viewlet.IssueGantt
)

const componentListViewOptions: ViewOptionsModel = {
groupBy: ['lead', 'createdBy', 'modifiedBy'],
orderBy: [
Expand Down
21 changes: 20 additions & 1 deletion plugins/tracker-assets/lang/cs.json
Original file line number Diff line number Diff line change
Expand Up @@ -283,7 +283,26 @@
"UnsetParentIssue": "Odebrat nadřazený úkol",
"ForbidCreateProjectPermission": "Zakázat vytvoření projektu",
"ForbidCreateProjectPermissionDescription": "Zakazuje uživatelům vytvářet nové projekty",
"AllowCreatingIssues": "Povolit vytváření úkolů"
"AllowCreatingIssues": "Povolit vytváření úkolů",
"Day": "Day",
"Week": "Week",
"Month": "Month",
"Quarter": "Quarter",
"Gantt": "Gantt",
"GanttShowIssueCode": "Show issue code",
"GanttShowTitle": "Show title",
"GanttShowStatus": "Show status",
"GanttToday": "Today",
"GanttJumpToStart": "Jump to start",
"GanttJumpToEnd": "Jump to end",
"GanttJumpToDate": "Jump to date",
"GanttPreviousPeriod": "Previous period",
"GanttNextPeriod": "Next period",
"GanttScrollLeftToBar": "Scroll left to bar",
"GanttScrollRightToBar": "Scroll right to bar",
"GanttExpand": "Expand",
"GanttCollapse": "Collapse"

},
"status": {}
}
21 changes: 20 additions & 1 deletion plugins/tracker-assets/lang/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -293,7 +293,26 @@
"UnsetParentIssue": "Übergeordnete Aufgabe entfernen",
"ForbidCreateProjectPermission": "Projekterstellung verbieten",
"ForbidCreateProjectPermissionDescription": "Verbietet Benutzern das Erstellen neuer Projekte",
"AllowCreatingIssues": "Erstellen von Aufgaben erlauben"
"AllowCreatingIssues": "Erstellen von Aufgaben erlauben",
"Day": "Day",
"Week": "Week",
"Month": "Month",
"Quarter": "Quarter",
"Gantt": "Gantt",
"GanttShowIssueCode": "Show issue code",
"GanttShowTitle": "Show title",
"GanttShowStatus": "Show status",
"GanttToday": "Today",
"GanttJumpToStart": "Jump to start",
"GanttJumpToEnd": "Jump to end",
"GanttJumpToDate": "Jump to date",
"GanttPreviousPeriod": "Previous period",
"GanttNextPeriod": "Next period",
"GanttScrollLeftToBar": "Scroll left to bar",
"GanttScrollRightToBar": "Scroll right to bar",
"GanttExpand": "Expand",
"GanttCollapse": "Collapse"

},
"status": {}
}
40 changes: 39 additions & 1 deletion plugins/tracker-assets/lang/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -293,7 +293,45 @@
"UnsetParentIssue": "Unset parent issue",
"ForbidCreateProjectPermission": "Forbid create project",
"ForbidCreateProjectPermissionDescription": "Forbid users creating new projects",
"AllowCreatingIssues": "Allow creating issues"
"AllowCreatingIssues": "Allow creating issues",
"Day": "Day",
"Week": "Week",
"Month": "Month",
"Quarter": "Quarter",
"Gantt": "Gantt",
"GanttShowIssueCode": "Show issue code",
"GanttShowTitle": "Show title",
"GanttShowStatus": "Show status",
"GanttToday": "Today",
"GanttJumpToStart": "Jump to start",
"GanttJumpToEnd": "Jump to end",
"GanttJumpToDate": "Jump to date",
"GanttPreviousPeriod": "Previous period",
"GanttNextPeriod": "Next period",
"GanttScrollLeftToBar": "Scroll left to bar",
"GanttScrollRightToBar": "Scroll right to bar",
"GanttExpand": "Expand",
"GanttCollapse": "Collapse",
"GanttDragConflict": "Issue was changed by someone else, please retry",
"GanttDragFailed": "Failed to apply Gantt edit",
"GanttDragNoPermission": "You don't have permission to edit this issue",
"GanttDragValidation": "Date is not valid: {reason}",
"GanttResizingTooltip": "{from} days → {to} days ({delta} d)",
"SetStartDate": "Set start date…",
"Hierarchy": "Hierarchy",
"LinkExistingSubIssue": "Link existing as sub-issue…",
"SetParentIssueLabel": "Set parent issue…",
"GanttDragToSchedule": "Drag to schedule",
"GanttDurationTooltip": "Duration: {days} d",
"GanttConfirmMove": "Confirm before moving an issue",
"GanttConfirmResize": "Confirm before resizing an issue",
"GanttConfirmMoveTitle": "Move issue?",
"GanttConfirmResizeTitle": "Change issue dates?",
"GanttConfirmMoveBody": "Move {title} to {start} – {due}?",
"GanttConfirmResizeBody": "Change {title} to {start} – {due}?",
"GanttConfirmApply": "Apply",
"GanttAriaResizeStart": "Resize start date",
"GanttAriaResizeEnd": "Resize due date"
},
"status": {}
}
21 changes: 20 additions & 1 deletion plugins/tracker-assets/lang/es.json
Original file line number Diff line number Diff line change
Expand Up @@ -276,7 +276,26 @@
"UnsetParentIssue": "Unset parent issue",
"ForbidCreateProjectPermission": "Prohibir crear proyecto",
"ForbidCreateProjectPermissionDescription": "Prohíbe a los usuarios crear nuevos proyectos",
"AllowCreatingIssues": "Permitir crear incidencias"
"AllowCreatingIssues": "Permitir crear incidencias",
"Day": "Day",
"Week": "Week",
"Month": "Month",
"Quarter": "Quarter",
"Gantt": "Gantt",
"GanttShowIssueCode": "Show issue code",
"GanttShowTitle": "Show title",
"GanttShowStatus": "Show status",
"GanttToday": "Today",
"GanttJumpToStart": "Jump to start",
"GanttJumpToEnd": "Jump to end",
"GanttJumpToDate": "Jump to date",
"GanttPreviousPeriod": "Previous period",
"GanttNextPeriod": "Next period",
"GanttScrollLeftToBar": "Scroll left to bar",
"GanttScrollRightToBar": "Scroll right to bar",
"GanttExpand": "Expand",
"GanttCollapse": "Collapse"

},
"status": {}
}
21 changes: 20 additions & 1 deletion plugins/tracker-assets/lang/fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -276,7 +276,26 @@
"UnsetParentIssue": "Désélectionner l'issue parent",
"ForbidCreateProjectPermission": "Interdire la création de projet",
"ForbidCreateProjectPermissionDescription": "Interdit aux utilisateurs de créer de nouveaux projets",
"AllowCreatingIssues": "Autoriser la création d'issues"
"AllowCreatingIssues": "Autoriser la création d'issues",
"Day": "Day",
"Week": "Week",
"Month": "Month",
"Quarter": "Quarter",
"Gantt": "Gantt",
"GanttShowIssueCode": "Show issue code",
"GanttShowTitle": "Show title",
"GanttShowStatus": "Show status",
"GanttToday": "Today",
"GanttJumpToStart": "Jump to start",
"GanttJumpToEnd": "Jump to end",
"GanttJumpToDate": "Jump to date",
"GanttPreviousPeriod": "Previous period",
"GanttNextPeriod": "Next period",
"GanttScrollLeftToBar": "Scroll left to bar",
"GanttScrollRightToBar": "Scroll right to bar",
"GanttExpand": "Expand",
"GanttCollapse": "Collapse"

},
"status": {}
}
21 changes: 20 additions & 1 deletion plugins/tracker-assets/lang/it.json
Original file line number Diff line number Diff line change
Expand Up @@ -276,7 +276,26 @@
"UnsetParentIssue": "Annulla l'issue genitore",
"ForbidCreateProjectPermission": "Vieta creazione progetto",
"ForbidCreateProjectPermissionDescription": "Vieta agli utenti di creare nuovi progetti",
"AllowCreatingIssues": "Consenti la creazione di issue"
"AllowCreatingIssues": "Consenti la creazione di issue",
"Day": "Day",
"Week": "Week",
"Month": "Month",
"Quarter": "Quarter",
"Gantt": "Gantt",
"GanttShowIssueCode": "Show issue code",
"GanttShowTitle": "Show title",
"GanttShowStatus": "Show status",
"GanttToday": "Today",
"GanttJumpToStart": "Jump to start",
"GanttJumpToEnd": "Jump to end",
"GanttJumpToDate": "Jump to date",
"GanttPreviousPeriod": "Previous period",
"GanttNextPeriod": "Next period",
"GanttScrollLeftToBar": "Scroll left to bar",
"GanttScrollRightToBar": "Scroll right to bar",
"GanttExpand": "Expand",
"GanttCollapse": "Collapse"

},
"status": {}
}
21 changes: 20 additions & 1 deletion plugins/tracker-assets/lang/ja.json
Original file line number Diff line number Diff line change
Expand Up @@ -276,7 +276,26 @@
"UnsetParentIssue": "親イシューの設定を解除",
"ForbidCreateProjectPermission": "プロジェクト作成禁止",
"ForbidCreateProjectPermissionDescription": "ユーザーが新しいプロジェクトを作成することを禁止します",
"AllowCreatingIssues": "イシューの作成を許可"
"AllowCreatingIssues": "イシューの作成を許可",
"Day": "Day",
"Week": "Week",
"Month": "Month",
"Quarter": "Quarter",
"Gantt": "Gantt",
"GanttShowIssueCode": "Show issue code",
"GanttShowTitle": "Show title",
"GanttShowStatus": "Show status",
"GanttToday": "Today",
"GanttJumpToStart": "Jump to start",
"GanttJumpToEnd": "Jump to end",
"GanttJumpToDate": "Jump to date",
"GanttPreviousPeriod": "Previous period",
"GanttNextPeriod": "Next period",
"GanttScrollLeftToBar": "Scroll left to bar",
"GanttScrollRightToBar": "Scroll right to bar",
"GanttExpand": "Expand",
"GanttCollapse": "Collapse"

},
"status": {}
}
20 changes: 19 additions & 1 deletion plugins/tracker-assets/lang/ko.json
Original file line number Diff line number Diff line change
Expand Up @@ -276,7 +276,25 @@
"UnsetParentIssue": "상위 이슈 설정 해제",
"ForbidCreateProjectPermission": "프로젝트 생성 금지",
"ForbidCreateProjectPermissionDescription": "사용자의 새 프로젝트 생성을 금지",
"AllowCreatingIssues": "이슈 생성 허용"
"AllowCreatingIssues": "이슈 생성 허용",
"Day": "Day",
"Week": "Week",
"Month": "Month",
"Quarter": "Quarter",
"Gantt": "Gantt",
"GanttShowIssueCode": "Show issue code",
"GanttShowTitle": "Show title",
"GanttShowStatus": "Show status",
"GanttToday": "Today",
"GanttJumpToStart": "Jump to start",
"GanttJumpToEnd": "Jump to end",
"GanttJumpToDate": "Jump to date",
"GanttPreviousPeriod": "Previous period",
"GanttNextPeriod": "Next period",
"GanttScrollLeftToBar": "Scroll left to bar",
"GanttScrollRightToBar": "Scroll right to bar",
"GanttExpand": "Expand",
"GanttCollapse": "Collapse"
},
"status": {}
}
21 changes: 20 additions & 1 deletion plugins/tracker-assets/lang/pt-br.json
Original file line number Diff line number Diff line change
Expand Up @@ -276,7 +276,26 @@
"UnsetParentIssue": "Desmarcar problema pai",
"ForbidCreateProjectPermission": "Proibir criação de projeto",
"ForbidCreateProjectPermissionDescription": "Proíbe os usuários de criar novos projetos",
"AllowCreatingIssues": "Permitir criar problemas"
"AllowCreatingIssues": "Permitir criar problemas",
"Day": "Day",
"Week": "Week",
"Month": "Month",
"Quarter": "Quarter",
"Gantt": "Gantt",
"GanttShowIssueCode": "Show issue code",
"GanttShowTitle": "Show title",
"GanttShowStatus": "Show status",
"GanttToday": "Today",
"GanttJumpToStart": "Jump to start",
"GanttJumpToEnd": "Jump to end",
"GanttJumpToDate": "Jump to date",
"GanttPreviousPeriod": "Previous period",
"GanttNextPeriod": "Next period",
"GanttScrollLeftToBar": "Scroll left to bar",
"GanttScrollRightToBar": "Scroll right to bar",
"GanttExpand": "Expand",
"GanttCollapse": "Collapse"

},
"status": {}
}
Loading