forked from EVOgeek/Vmeda.Online
		
	Merge pull request #3706 from crazyserver/MOBILE-3973
MOBILE-3973 course: Support svg geopatterns in the app
This commit is contained in:
		
						commit
						13dadcac0f
					
				| @ -18,8 +18,8 @@ | |||||||
|     </ion-refresher> |     </ion-refresher> | ||||||
|     <core-loading [hideUntil]="dataLoaded"> |     <core-loading [hideUntil]="dataLoaded"> | ||||||
|         <div *ngIf="course" class="core-course-thumb" #courseThumb> |         <div *ngIf="course" class="core-course-thumb" #courseThumb> | ||||||
|             <img *ngIf="course.courseImage" [src]="course.courseImage" core-external-content alt="" /> |             <img *ngIf="course.courseimage" [src]="course.courseimage" core-external-content alt="" (error)="loadFallbackCourseIcon()" /> | ||||||
|             <ion-icon *ngIf="!course.courseImage" name="fas-graduation-cap" class="course-icon" aria-hidden="true"> |             <ion-icon *ngIf="!course.courseimage" name="fas-graduation-cap" class="course-icon" aria-hidden="true"> | ||||||
|             </ion-icon> |             </ion-icon> | ||||||
|         </div> |         </div> | ||||||
|         <div *ngIf="course" class="course-container"> |         <div *ngIf="course" class="course-container"> | ||||||
|  | |||||||
| @ -466,6 +466,20 @@ export class CoreCourseSummaryPage implements OnInit, OnDestroy { | |||||||
|         CoreNavigator.navigateToSitePath(item.data.page, { params }); |         CoreNavigator.navigateToSitePath(item.data.page, { params }); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     /** | ||||||
|  |      * Removes the course image set because it cannot be loaded and set the fallback icon color. | ||||||
|  |      */ | ||||||
|  |     loadFallbackCourseIcon(): void { | ||||||
|  |         if (!this.course) { | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         this.course.courseimage = undefined; | ||||||
|  | 
 | ||||||
|  |         // Set the color because it won't be set at this point.
 | ||||||
|  |         this.setCourseColor(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     /** |     /** | ||||||
|      * Set course color. |      * Set course color. | ||||||
|      */ |      */ | ||||||
|  | |||||||
| @ -27,6 +27,11 @@ | |||||||
|             width: 100%; |             width: 100%; | ||||||
|             height: 100%; |             height: 100%; | ||||||
|             object-fit: cover; |             object-fit: cover; | ||||||
|  | 
 | ||||||
|  |             // Fill geopaterns | ||||||
|  |             &[src$=".svg"] { | ||||||
|  |                 min-width: 100%; | ||||||
|  |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         ion-icon.course-icon { |         ion-icon.course-icon { | ||||||
|  | |||||||
| @ -21,12 +21,12 @@ | |||||||
| <div class="core-course-header"> | <div class="core-course-header"> | ||||||
|     <ion-item class="core-format-progress-list ion-text-wrap list-item-limited-width" collapsible> |     <ion-item class="core-format-progress-list ion-text-wrap list-item-limited-width" collapsible> | ||||||
|         <ng-container *ngIf="course"> |         <ng-container *ngIf="course"> | ||||||
|             <div *ngIf="!course.courseImage" #courseThumb slot="start" class="core-course-thumb"> |             <div *ngIf="!course.courseimage" #courseThumb slot="start" class="core-course-thumb"> | ||||||
|                 <ion-icon *ngIf="!course.courseImage" name="fas-graduation-cap" class="course-icon" aria-hidden="true"> |                 <ion-icon name="fas-graduation-cap" class="course-icon" aria-hidden="true"> | ||||||
|                 </ion-icon> |                 </ion-icon> | ||||||
|             </div> |             </div> | ||||||
|             <ion-avatar *ngIf="course.courseImage" slot="start" class="core-course-thumb"> |             <ion-avatar *ngIf="course.courseimage" slot="start" class="core-course-thumb"> | ||||||
|                 <img [src]="course.courseImage" core-external-content alt="" /> |                 <img [src]="course.courseimage" core-external-content alt="" /> | ||||||
|             </ion-avatar> |             </ion-avatar> | ||||||
|         </ng-container> |         </ng-container> | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -27,6 +27,11 @@ | |||||||
|             color: var(--course-color-tint); |             color: var(--course-color-tint); | ||||||
|             background: var(--course-color, transparent); |             background: var(--course-color, transparent); | ||||||
|         } |         } | ||||||
|  | 
 | ||||||
|  |         // Fill geopaterns | ||||||
|  |         img[src$=".svg"] { | ||||||
|  |             min-width: 100%; | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     @if ($core-hide-courseimage-on-course) { |     @if ($core-hide-courseimage-on-course) { | ||||||
|  | |||||||
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 37 KiB | 
| @ -2,9 +2,9 @@ | |||||||
|     [class.core-course-list-card]="layout == 'card' || layout == 'summarycard'" [class.item-dimmed]="course.hidden" (click)="openCourse()" |     [class.core-course-list-card]="layout == 'card' || layout == 'summarycard'" [class.item-dimmed]="course.hidden" (click)="openCourse()" | ||||||
|     button [attr.aria-label]="course.displayname || course.fullname"> |     button [attr.aria-label]="course.displayname || course.fullname"> | ||||||
| 
 | 
 | ||||||
|     <div *ngIf="layout == 'card' || layout == 'summarycard'" class="core-course-thumb" [class.core-course-color-img]="course.courseImage"> |     <div *ngIf="layout == 'card' || layout == 'summarycard'" class="core-course-thumb" [class.core-course-color-img]="course.courseimage"> | ||||||
|         <img *ngIf="course.courseImage" [src]="course.courseImage" core-external-content alt="" /> |         <img *ngIf="course.courseimage" [src]="course.courseimage" core-external-content alt="" (error)="loadFallbackCourseIcon()" /> | ||||||
|         <ion-icon *ngIf="!course.courseImage" name="fas-graduation-cap" class="course-icon" aria-hidden="true"> |         <ion-icon *ngIf="!course.courseimage" name="fas-graduation-cap" class="course-icon" aria-hidden="true"> | ||||||
|         </ion-icon> |         </ion-icon> | ||||||
|     </div> |     </div> | ||||||
| 
 | 
 | ||||||
| @ -30,11 +30,11 @@ | |||||||
|     <ion-item class="ion-text-wrap"> |     <ion-item class="ion-text-wrap"> | ||||||
| 
 | 
 | ||||||
|         <ng-container *ngIf="layout == 'list' || layout == 'listwithenrol'"> |         <ng-container *ngIf="layout == 'list' || layout == 'listwithenrol'"> | ||||||
|             <ion-icon *ngIf="!course.courseImage" name="fas-graduation-cap" slot="start" class="course-icon core-course-thumb" |             <ion-icon *ngIf="!course.courseimage" name="fas-graduation-cap" slot="start" class="course-icon core-course-thumb" | ||||||
|                 aria-hidden="true"> |                 aria-hidden="true"> | ||||||
|             </ion-icon> |             </ion-icon> | ||||||
|             <ion-avatar *ngIf="course.courseImage" slot="start" class="core-course-thumb"> |             <ion-avatar *ngIf="course.courseimage" slot="start" class="core-course-thumb"> | ||||||
|                 <img [src]="course.courseImage" core-external-content alt="" /> |                 <img [src]="course.courseimage" core-external-content alt="" (error)="loadFallbackCourseIcon()" /> | ||||||
|             </ion-avatar> |             </ion-avatar> | ||||||
|         </ng-container> |         </ng-container> | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -138,6 +138,10 @@ ion-card.core-course-list-item { | |||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // Fill geopaterns | ||||||
|  | .core-course-thumb img[src$=".svg"] { | ||||||
|  |     min-width: 100%; | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| // Card layout. | // Card layout. | ||||||
| ion-card.core-course-list-card { | ion-card.core-course-list-card { | ||||||
|  | |||||||
| @ -111,7 +111,7 @@ export class CoreCoursesCourseListItemComponent implements OnInit, OnDestroy, On | |||||||
|                         label: 'core.courses.allowguests', |                         label: 'core.courses.allowguests', | ||||||
|                         icon: 'fas-unlock', |                         icon: 'fas-unlock', | ||||||
|                     }); |                     }); | ||||||
|                 } else if (instance === 'paypal') { |                 } else if (instance === 'paypal' || instance === 'fee') { | ||||||
|                     this.enrolmentIcons.push({ |                     this.enrolmentIcons.push({ | ||||||
|                         label: 'core.courses.otherenrolments', |                         label: 'core.courses.otherenrolments', | ||||||
|                         icon: 'fas-up-right-from-square', |                         icon: 'fas-up-right-from-square', | ||||||
| @ -128,6 +128,16 @@ export class CoreCoursesCourseListItemComponent implements OnInit, OnDestroy, On | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     /** | ||||||
|  |      * Removes the course image set because it cannot be loaded and set the fallback icon color. | ||||||
|  |      */ | ||||||
|  |     loadFallbackCourseIcon(): void { | ||||||
|  |         this.course.courseimage = undefined; | ||||||
|  | 
 | ||||||
|  |         // Set the color because it won't be set at this point.
 | ||||||
|  |         this.setCourseColor(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     /** |     /** | ||||||
|      * Set course color. |      * Set course color. | ||||||
|      */ |      */ | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| <ion-card [attr.course-color]="course.color ? null : course.colorNumber"> | <ion-card [attr.course-color]="course.color ? null : course.colorNumber"> | ||||||
|     <div (click)="openCourse()" class="core-course-thumb" [class.core-course-color-img]="course.courseImage" |     <div (click)="openCourse()" class="core-course-thumb" [class.core-course-color-img]="course.courseimage" | ||||||
|         [style.background-color]="course.color"> |         [style.background-color]="course.color"> | ||||||
|         <img *ngIf="course.courseImage" [src]="course.courseImage" core-external-content alt="" /> |         <img *ngIf="course.courseimage" [src]="course.courseimage" core-external-content alt="" /> | ||||||
|     </div> |     </div> | ||||||
|     <ion-item button (click)="openCourse()" [attr.aria-label]="course.displayname || course.fullname" class="core-course-header" |     <ion-item button (click)="openCourse()" [attr.aria-label]="course.displayname || course.fullname" class="core-course-header" | ||||||
|         [class.core-course-only-title]="!showAll || progress < 0 && completionUserTracked === false" detail="false"> |         [class.core-course-only-title]="!showAll || progress < 0 && completionUserTracked === false" detail="false"> | ||||||
|  | |||||||
| @ -40,6 +40,11 @@ | |||||||
|                 right: 0; |                 right: 0; | ||||||
|                 left: 0; |                 left: 0; | ||||||
|                 margin: auto; |                 margin: auto; | ||||||
|  | 
 | ||||||
|  |                 // Fill geopaterns | ||||||
|  |                 &[src$=".svg"] { | ||||||
|  |                     min-width: 100%; | ||||||
|  |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -205,8 +205,20 @@ export class CoreCoursesHelperProvider { | |||||||
|      * @param course Course data. |      * @param course Course data. | ||||||
|      */ |      */ | ||||||
|     async loadCourseColorAndImage(course: CoreCourseWithImageAndColor): Promise<void> { |     async loadCourseColorAndImage(course: CoreCourseWithImageAndColor): Promise<void> { | ||||||
|  |         // Moodle 4.1 downwards geopatterns are embedded in b64 in only some WS, remote them to keep it coherent.
 | ||||||
|  |         if (course.courseimage?.startsWith('data')) { | ||||||
|  |             course.courseimage = undefined; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (course.courseimage !== undefined) { | ||||||
|  |             course.courseImage = course.courseimage; // @deprecated sinde 4.3 use courseimage instead.
 | ||||||
|  | 
 | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|         if (course.overviewfiles && course.overviewfiles[0]) { |         if (course.overviewfiles && course.overviewfiles[0]) { | ||||||
|             course.courseImage = course.overviewfiles[0].fileurl; |             course.courseimage = course.overviewfiles[0].fileurl; | ||||||
|  |             course.courseImage = course.courseimage; // @deprecated sinde 4.3 use courseimage instead.
 | ||||||
| 
 | 
 | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
| @ -436,7 +448,8 @@ export type CoreCourseWithImageAndColor = { | |||||||
|     overviewfiles?: CoreWSExternalFile[]; |     overviewfiles?: CoreWSExternalFile[]; | ||||||
|     colorNumber?: number; // Color index number.
 |     colorNumber?: number; // Color index number.
 | ||||||
|     color?: string; // Color RGB.
 |     color?: string; // Color RGB.
 | ||||||
|     courseImage?: string; // Course thumbnail.
 |     courseImage?: string; // Course thumbnail. @deprecated since 4.3, use courseimage instead.
 | ||||||
|  |     courseimage?: string; // Course thumbnail.
 | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user