@@ -20,21 +20,29 @@ <h2>Project Kanban Board</h2>
2020 < i class ="pi pi-list "> </ i >
2121 {{ selectedProjectTaskCount }} tasks
2222 </ span >
23+ < span class ="meta-pill " *ngIf ="isAssigneeFilterActive ">
24+ < i class ="pi pi-filter "> </ i >
25+ {{ visibleTaskCount }} shown · {{ selectedAssigneeFilterLabel }}
26+ </ span >
2327 < span class ="meta-pill " *ngIf ="isPreviewMode ">
2428 < i class ="pi pi-eye "> </ i >
2529 Preview mode
2630 </ span >
2731 </ div >
2832 </ div >
33+ </ div >
34+ </ p-card >
2935
30- < div class ="project-console " *ngIf ="selectedProject as project ">
31- < div class ="project-console__top ">
32- < span class ="project-console__heading "> Project Context</ span >
33- < span class ="project-console__counter "> {{ selectedProjectIndex + 1 }} / {{ projects.length }}</ span >
36+ < p-card class ="kanban-controls-card ">
37+ < div class ="kanban-controls-grid ">
38+ < section class ="kanban-control-block ">
39+ < div class ="kanban-control-block__top ">
40+ < span class ="kanban-control-block__heading "> Project Scope</ span >
41+ < span class ="kanban-control-block__counter "> {{ selectedProjectIndex + 1 }} / {{ projects.length }}</ span >
3442 </ div >
3543
36- < div class ="project-console__picker ">
37- < button pButton type ="button " icon ="pi pi-angle-left " class ="p-button-rounded p-button-text p-button-sm project-console__nav " [disabled] ="!canSelectPreviousProject || isLoadingProjects " (click) ="selectPreviousProject() "> </ button >
44+ < div class ="kanban-control-block__picker ">
45+ < button pButton type ="button " icon ="pi pi-angle-left " class ="p-button-rounded p-button-text p-button-sm kanban-control-nav " [disabled] ="!canSelectPreviousProject || isLoadingProjects " (click) ="selectPreviousProject() "> </ button >
3846
3947 < p-dropdown
4048 inputId ="projectPicker "
@@ -45,17 +53,70 @@ <h2>Project Kanban Board</h2>
4553 [filter] ="true "
4654 filterBy ="name "
4755 [showClear] ="false "
56+ [appendTo] ="'body' "
4857 [disabled] ="isLoadingProjects || projects.length === 0 "
4958 placeholder ="Select project "
50- styleClass ="project-console__dropdown "
59+ styleClass ="kanban-control-dropdown "
5160 (onChange) ="onProjectSelected($event.value) ">
5261 </ p-dropdown >
5362
54- < button pButton type ="button " icon ="pi pi-angle-right " class ="p-button-rounded p-button-text p-button-sm project-console__nav " [disabled] ="!canSelectNextProject || isLoadingProjects " (click) ="selectNextProject() "> </ button >
63+ < button pButton type ="button " icon ="pi pi-angle-right " class ="p-button-rounded p-button-text p-button-sm kanban-control-nav " [disabled] ="!canSelectNextProject || isLoadingProjects " (click) ="selectNextProject() "> </ button >
5564 </ div >
65+ </ section >
5666
57- < span class ="project-console__hint "> Use arrows or search to switch project scope.</ span >
58- </ div >
67+ < section class ="kanban-control-block ">
68+ < div class ="kanban-control-block__top ">
69+ < span class ="kanban-control-block__heading "> Task Lens</ span >
70+ < span class ="kanban-control-block__counter "> {{ selectedAssigneeFilterLabel }}</ span >
71+ </ div >
72+
73+ < div class ="kanban-control-block__filter ">
74+ < p-dropdown
75+ *ngIf ="canManageAllTasks; else collaboratorLens "
76+ inputId ="kanbanAssigneeFilter "
77+ [options] ="managementAssigneeFilterOptions "
78+ optionLabel ="label "
79+ optionValue ="value "
80+ [(ngModel)] ="selectedAssigneeFilter "
81+ [filter] ="true "
82+ filterBy ="label "
83+ [showClear] ="false "
84+ [appendTo] ="'body' "
85+ styleClass ="kanban-control-dropdown "
86+ (onChange) ="onAssigneeFilterChange($any($event).value) ">
87+ </ p-dropdown >
88+
89+ < ng-template #collaboratorLens >
90+ < div class ="kanban-control-filter-inline ">
91+ < div class ="kanban-control-filter-buttons ">
92+ < button
93+ *ngFor ="let option of collaboratorAssigneeFilterOptions "
94+ pButton
95+ type ="button "
96+ class ="p-button-sm p-button-outlined kanban-control-filter-button "
97+ [class.kanban-control-filter-button--active] ="selectedAssigneeFilter === option.value "
98+ [label] ="option.label "
99+ (click) ="onAssigneeFilterChange(option.value) ">
100+ </ button >
101+ </ div >
102+
103+ < p-dropdown
104+ inputId ="kanbanAssigneeFilterUser "
105+ [options] ="collaboratorAssigneeDirectoryOptions "
106+ optionLabel ="label "
107+ optionValue ="value "
108+ [ngModel] ="selectedAssigneeFilter "
109+ [filter] ="true "
110+ filterBy ="label "
111+ [showClear] ="false "
112+ [appendTo] ="'body' "
113+ styleClass ="kanban-control-dropdown kanban-control-dropdown--user "
114+ (onChange) ="onAssigneeFilterChange($any($event).value) ">
115+ </ p-dropdown >
116+ </ div >
117+ </ ng-template >
118+ </ div >
119+ </ section >
59120 </ div >
60121 </ p-card >
61122
@@ -94,7 +155,7 @@ <h2>Project Kanban Board</h2>
94155 < div class ="kanban-column-body ">
95156 < div class ="task-stack ">
96157 < div
97- *ngIf ="getColumnTaskCount(column.status) === 0 && selectedProjectTaskCount > 0 "
158+ *ngIf ="getColumnTaskCount(column.status) === 0 && visibleTaskCount > 0 "
98159 class ="kanban-empty-drop-target "
99160 [class.kanban-empty-drop-target--active] ="isDropSlotActive(column.status, 0) "
100161 (dragover) ="onDropSlotDragOver(column.status, 0, $event) "
@@ -179,7 +240,7 @@ <h2>Project Kanban Board</h2>
179240 </ ng-container >
180241
181242 < div
182- *ngIf ="selectedProjectTaskCount > 0 "
243+ *ngIf ="visibleTaskCount > 0 "
183244 class ="kanban-drop-slot kanban-drop-slot--end "
184245 [class.kanban-drop-slot--active] ="isDropSlotActive(column.status, getColumnTaskCount(column.status)) "
185246 (dragover) ="onDropSlotDragOver(column.status, getColumnTaskCount(column.status), $event) "
@@ -214,7 +275,7 @@ <h2>Project Kanban Board</h2>
214275 </ div >
215276
216277 < div *ngIf ="selectedProjectId && getColumnTaskCount(column.status) === 0 " class ="kanban-column-empty ">
217- No tasks in this column yet.
278+ {{ isAssigneeFilterActive ? ' No tasks match this filter in this column.' : 'No tasks in this column yet.' }}
218279 </ div >
219280 </ div >
220281 </ p-card >
0 commit comments