1- @if (projects.length > 0) {
2- @for (project of projects; track project.id) {
3- < div class ="project ">
4- < h2 > {{ project.name }}</ h2 >
5- < p > {{ project.description }}</ p >
6-
7- @if (project.taskItems && project.taskItems.length > 0) {
8- < div class ="tasks ">
9- @for (task of project.taskItems; track task.id) {
10- < div class ="task ">
11- < span > {{ task.title }} - {{ task.status }}</ span >
12- </ div >
13- }
14- </ div >
15- } @else {
16- < p > No tasks for this project</ p >
17- }
1+ < div class ="grid ">
2+ < div class ="col-12 ">
3+ < p-card >
4+ < div class ="card ">
5+ < p-table #dt1 [value] ="projects " dataKey ="id " [rows] ="10 " [rowsPerPageOptions] ="[10, 25, 50] "
6+ [loading] ="loading " [paginator] ="true " styleClass ="p-datatable-gridlines "
7+ [globalFilterFields] ="['name', 'country.name', 'representative.name', 'status'] ">
8+ < ng-template pTemplate ="caption ">
9+ < div class ="flex ">
10+ < p-button label ="Clear " [outlined] ="true " icon ="pi pi-filter-slash " (onClick) ="clear(dt1) " />
11+ < span class ="p-input-icon-left ml-auto ">
12+ < i class ="pi pi-search "> </ i >
13+ < input pInputText type ="text " [(ngModel)] ="searchValue " (input) ="onGlobalFilter(dt1, $event) "
14+ placeholder ="Search keyword " />
15+ </ span >
16+ </ div >
17+ </ ng-template >
18+ < ng-template pTemplate ="header ">
19+ < tr >
20+ < th style ="min-width:15rem ">
21+ < div class ="flex align-items-center ">
22+ Name
23+ < p-columnFilter type ="text " field ="name " display ="menu " />
24+ </ div >
25+ </ th >
26+ < th style ="min-width:15rem ">
27+ < div class ="flex align-items-center ">
28+ Owner
29+ < p-columnFilter field ="representative " matchMode ="in " display ="menu " [showMatchModes] ="false "
30+ [showOperator] ="false " [showAddButton] ="false ">
31+ < ng-template pTemplate ="header ">
32+ < div class ="px-3 pt-3 pb-0 ">
33+ < span class ="font-bold "> Owner Picker</ span >
34+ </ div >
35+ </ ng-template >
36+ < ng-template pTemplate ="filter " let-value let-filter ="filterCallback ">
37+ < p-multiSelect [ngModel] ="value " [options] ="representatives " placeholder ="Any "
38+ (onChange) ="filter($event.value) " optionLabel ="name ">
39+ < ng-template let-option pTemplate ="item ">
40+ < div class ="inline-block vertical-align-middle ">
41+ < img [alt] ="option.label "
42+ src ="https://primefaces.org/cdn/primeng/images/demo/avatar/{{ option.image }} " width ="24 "
43+ class ="vertical-align-middle " />
44+ < span class ="ml-1 mt-1 "> {{ option.name }}</ span >
45+ </ div >
46+ </ ng-template >
47+ </ p-multiSelect >
48+ </ ng-template >
49+ </ p-columnFilter >
50+ </ div >
51+ </ th >
52+ < th style ="min-width:10rem ">
53+ < div class ="flex align-items-center ">
54+ Created At
55+ < p-columnFilter type ="date " field ="createdate " display ="menu " />
56+ </ div >
57+ </ th >
58+ < th style ="min-width:10rem ">
59+ < div class ="flex align-items-center ">
60+ Last Modified At
61+ < p-columnFilter type ="date " field ="modifydate " display ="menu " />
62+ </ div >
63+ </ th >
64+ < th style ="min-width:10rem ">
65+ < div class ="flex align-items-center ">
66+ Status
67+ < p-columnFilter field ="status " matchMode ="equals " display ="menu ">
68+ < ng-template pTemplate ="filter " let-value let-filter ="filterCallback ">
69+ < p-dropdown [ngModel] ="value " [options] ="statuses " (onChange) ="filter($event.value) "
70+ placeholder ="Any ">
71+ < ng-template let-option pTemplate ="item ">
72+ < p-tag [value] ="option.value " [severity] ="getSeverity(option.label) " />
73+ </ ng-template >
74+ </ p-dropdown >
75+ </ ng-template >
76+ </ p-columnFilter >
77+ </ div >
78+ </ th >
79+ < th style ="min-width:10rem ">
80+ < div class ="flex align-items-center ">
81+ Activity
82+ < p-columnFilter field ="activity " matchMode ="between " display ="menu " [showMatchModes] ="false "
83+ [showOperator] ="false " [showAddButton] ="false ">
84+ < ng-template pTemplate ="filter " let-filter ="filterCallback ">
85+ < p-slider [(ngModel)] ="activityValues " [range] ="true " (onSlideEnd) ="filter($event.values) "
86+ styleClass ="m-3 " />
87+ < div class ="flex align-items-center px-2 ">
88+ < span > {{ activityValues[0] }}</ span >
89+ < span > {{ activityValues[1] }}</ span >
90+ </ div >
91+ </ ng-template >
92+ </ p-columnFilter >
93+ </ div >
94+ </ th >
95+ < th style ="width: 3rem ">
96+ < div class ="flex align-items-center ">
97+ Verified
98+ < p-columnFilter type ="boolean " field ="verified " display ="menu " />
99+ </ div >
100+ </ th >
101+ </ tr >
102+ </ ng-template >
103+ < ng-template pTemplate ="body " let-project >
104+ < tr >
105+ < td >
106+ {{ project.name }}
107+ </ td >
108+ < td >
109+ < img [alt] ="project.createdBy " src ="https://primefaces.org/cdn/primeng/images/demo/avatar/amyelsner.png "
110+ width ="32 " style ="vertical-align: middle " />
111+ < span class ="ml-1 vertical-align-middle "> {{ project.createdBy }}</ span >
112+ </ td >
113+ < td >
114+ {{ project.createdAt | date: 'MM/dd/yyyy' }}
115+ </ td >
116+ < td >
117+ {{ project.lastModifiedAt | date: 'MM/dd/yyyy' }}
118+ </ td >
119+ < td >
120+ < p-tag [value] ="'new' " [severity] ="getSeverity('new') " />
121+ </ td >
122+ < td >
123+ < p-progressBar [value] ="30 " [showValue] ="false " />
124+ </ td >
125+ < td class ="text-center ">
126+ < i class ="pi "
127+ [ngClass] ="{ 'text-green-500 pi-check-circle': true, 'text-red-500 pi-times-circle': false } "> </ i >
128+ </ td >
129+ </ tr >
130+ </ ng-template >
131+ < ng-template pTemplate ="emptymessage ">
132+ < tr >
133+ < td colspan ="7 "> No projects found.</ td >
134+ </ tr >
135+ </ ng-template >
136+ </ p-table >
18137 </ div >
19- }
20- } @else {
21- < p > No projects found</ p >
22- }
138+ </ p-card >
139+ </ div >
140+ </ div >
0 commit comments