2121 </ ion-refresher >
2222 < core-loading [hideUntil] ="dataLoaded ">
2323 @if (course) {
24- < div class ="core-course-thumb " #courseThumb >
25- @if (course.courseimage) {
26- < img [url] ="course.courseimage " core-external-content alt ="" (error) ="loadFallbackCourseIcon() " />
27- } @else {
28- < ion-icon name ="fas-graduation-cap " class ="course-icon " aria-hidden ="true " />
29- }
30- </ div >
24+ < core-course-image [course] ="course " class ="page-top " />
3125
3226 < div class ="course-container ">
3327 < div class ="list-item-limited-width ">
@@ -113,16 +107,16 @@ <h2 class="item-heading">
113107 </ ion-label >
114108 </ ion-item >
115109 @if (contactsExpanded || course.contacts.length < 5 ) {
116-
117- < ion-item button class ="ion-text-wrap " *ngFor =" let contact of course.contacts " core-user-link
118- [userId] ="contact.id " [courseId] ="isEnrolled ? course.id : null " [detail] ="true ">
119- < core-user-avatar [user] ="contact " slot ="start " [userId] ="contact.id "
120- [courseId] ="isEnrolled ? course.id : null " [linkProfile] ="false " />
121- < ion-label >
122- < p class ="item-heading "> {{contact.fullname}}</ p >
123- </ ion-label >
124- </ ion-item >
125-
110+ @for (contact of course.contacts; track contact.id) {
111+ < ion-item button class ="ion-text-wrap " core-user-link
112+ [userId] ="contact.id " [courseId] ="isEnrolled ? course.id : null " [detail] ="true ">
113+ < core-user-avatar [user] ="contact " slot ="start " [userId] ="contact.id "
114+ [courseId] ="isEnrolled ? course.id : null " [linkProfile] ="false " />
115+ < ion-label >
116+ < p class ="item-heading "> {{contact.fullname}}</ p >
117+ </ ion-label >
118+ </ ion-item >
119+ }
126120 }
127121 < core-spacer />
128122 </ ion-list >
@@ -131,7 +125,7 @@ <h2 class="item-heading">
131125 @if (course.customfields) {
132126 < ion-item class ="ion-text-wrap ">
133127 < ion-label >
134- < ng-container *ngFor =" let field of course.customfields" >
128+ @for ( field of course.customfields; track field.shortname) {
135129 @if (field.value) {
136130 < div class ="core-customfield core-customfield_{{field.type}} core-customfield_{{field.shortname}} ">
137131 < span class ="core-customfieldname ">
@@ -146,7 +140,7 @@ <h2 class="item-heading">
146140 </ span >
147141 </ div >
148142 }
149- </ ng-container >
143+ }
150144 </ ion-label >
151145 </ ion-item >
152146 }
@@ -160,15 +154,15 @@ <h2 class="item-heading">
160154 < ion-footer >
161155 < div class ="list-item-limited-width ">
162156 @if (canAccessCourse) {
163-
164- < ion-button *ngFor =" let item of courseMenuHandlers " (click) ="openMenuItem(item) " [class] ="'ion-text-wrap '+ item.data.class "
165- expand ="block ">
166- @if (item.data.icon) {
167- < ion-icon [name] ="item.data.icon " slot ="start " aria-hidden ="true " />
168- }
169- < ion-label > {{item.data.title | translate }}</ ion-label >
170- </ ion-button >
171-
157+ @for (item of courseMenuHandlers; track item.name) {
158+ < ion-button (click) ="openMenuItem(item) " [class] ="'ion-text-wrap '+ item.data.class "
159+ expand ="block ">
160+ @if (item.data.icon) {
161+ < ion-icon [name] ="item.data.icon " slot ="start " aria-hidden ="true " />
162+ }
163+ < ion-label > {{item.data.title | translate }}</ ion-label >
164+ </ ion-button >
165+ }
172166 }
173167 @if (!isEnrolled) {
174168
0 commit comments