forked from EVOgeek/Vmeda.Online
		
	MOBILE-3833 loading: Change loading usage
This commit is contained in:
		
							parent
							
								
									cb63541195
								
							
						
					
					
						commit
						90ddcd7827
					
				| @ -9,11 +9,11 @@ | |||||||
|         </ion-title> |         </ion-title> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content [core-swipe-navigation]="badges"> | <ion-content [core-swipe-navigation]="badges" class="limited-width"> | ||||||
|     <ion-refresher slot="fixed" [disabled]="!badgeLoaded" (ionRefresh)="refreshBadges($event.target)"> |     <ion-refresher slot="fixed" [disabled]="!badgeLoaded" (ionRefresh)="refreshBadges($event.target)"> | ||||||
|         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> |         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> | ||||||
|     </ion-refresher> |     </ion-refresher> | ||||||
|     <core-loading [hideUntil]="badgeLoaded" class="list-item-limited-width"> |     <core-loading [hideUntil]="badgeLoaded"> | ||||||
|         <ion-item-group *ngIf="badge"> |         <ion-item-group *ngIf="badge"> | ||||||
|             <ion-item class="ion-text-wrap ion-text-center"> |             <ion-item class="ion-text-wrap ion-text-center"> | ||||||
|                 <ion-label> |                 <ion-label> | ||||||
|  | |||||||
| @ -3,7 +3,7 @@ | |||||||
|         <h2>{{ 'addon.block_activitymodules.pluginname' | translate }}</h2> |         <h2>{{ 'addon.block_activitymodules.pluginname' | translate }}</h2> | ||||||
|     </ion-label> |     </ion-label> | ||||||
| </ion-item-divider> | </ion-item-divider> | ||||||
| <core-loading [hideUntil]="loaded" [fullscreen]="false"> | <core-loading [hideUntil]="loaded"> | ||||||
|     <ion-item class="ion-text-wrap" *ngFor="let entry of entries" detail="true" button (click)="gotoCoureListModType(entry)"> |     <ion-item class="ion-text-wrap" *ngFor="let entry of entries" detail="true" button (click)="gotoCoureListModType(entry)"> | ||||||
|         <core-mod-icon slot="start" [modicon]="entry.icon" [modname]="entry.iconModName" [showAlt]="false"> |         <core-mod-icon slot="start" [modicon]="entry.icon" [modname]="entry.iconModName" [showAlt]="false"> | ||||||
|         </core-mod-icon> |         </core-mod-icon> | ||||||
|  | |||||||
| @ -20,7 +20,7 @@ | |||||||
|         </div> |         </div> | ||||||
|     </div> |     </div> | ||||||
| </ion-item-divider> | </ion-item-divider> | ||||||
| <core-loading [hideUntil]="loaded" [fullscreen]="false"> | <core-loading [hideUntil]="loaded"> | ||||||
| 
 | 
 | ||||||
|     <ion-row class="ion-justify-content-between ion-align-items-center addon-block-myoverview-filter" *ngIf="hasCourses"> |     <ion-row class="ion-justify-content-between ion-align-items-center addon-block-myoverview-filter" *ngIf="hasCourses"> | ||||||
|         <ion-col size="auto" *ngIf="filters.enabled"> |         <ion-col size="auto" *ngIf="filters.enabled"> | ||||||
|  | |||||||
| @ -7,7 +7,7 @@ | |||||||
|         </core-horizontal-scroll-controls> |         </core-horizontal-scroll-controls> | ||||||
|     </div> |     </div> | ||||||
| </ion-item-divider> | </ion-item-divider> | ||||||
| <core-loading [hideUntil]="loaded" [fullscreen]="false"> | <core-loading [hideUntil]="loaded"> | ||||||
|     <core-empty-box *ngIf="courses.length == 0" image="assets/img/icons/courses.svg" |     <core-empty-box *ngIf="courses.length == 0" image="assets/img/icons/courses.svg" | ||||||
|         [message]="'addon.block_recentlyaccessedcourses.nocourses' | translate"></core-empty-box> |         [message]="'addon.block_recentlyaccessedcourses.nocourses' | translate"></core-empty-box> | ||||||
|     <!-- List of courses. --> |     <!-- List of courses. --> | ||||||
|  | |||||||
| @ -7,7 +7,7 @@ | |||||||
|         </core-horizontal-scroll-controls> |         </core-horizontal-scroll-controls> | ||||||
|     </div> |     </div> | ||||||
| </ion-item-divider> | </ion-item-divider> | ||||||
| <core-loading [hideUntil]="loaded" [fullscreen]="false"> | <core-loading [hideUntil]="loaded"> | ||||||
|     <div [id]="scrollElementId" [hidden]="!items || items.length === 0" class="core-horizontal-scroll" |     <div [id]="scrollElementId" [hidden]="!items || items.length === 0" class="core-horizontal-scroll" | ||||||
|         (scroll)="scrollControls.updateScrollPosition()"> |         (scroll)="scrollControls.updateScrollPosition()"> | ||||||
|         <div *ngIf="items" (onResize)="scrollControls.updateScrollPosition()" class="flex-row"> |         <div *ngIf="items" (onResize)="scrollControls.updateScrollPosition()" class="flex-row"> | ||||||
|  | |||||||
| @ -3,7 +3,7 @@ | |||||||
|         <h2>{{ 'addon.block_sitemainmenu.pluginname' | translate }}</h2> |         <h2>{{ 'addon.block_sitemainmenu.pluginname' | translate }}</h2> | ||||||
|     </ion-label> |     </ion-label> | ||||||
| </ion-item-divider> | </ion-item-divider> | ||||||
| <core-loading [hideUntil]="loaded" [fullscreen]="false"> | <core-loading [hideUntil]="loaded"> | ||||||
|     <ion-list *ngIf="mainMenuBlock" class="core-course-module-list-wrapper"> |     <ion-list *ngIf="mainMenuBlock" class="core-course-module-list-wrapper"> | ||||||
|         <ion-item class="ion-text-wrap" *ngIf="mainMenuBlock.summary"> |         <ion-item class="ion-text-wrap" *ngIf="mainMenuBlock.summary"> | ||||||
|             <ion-label> |             <ion-label> | ||||||
|  | |||||||
| @ -7,7 +7,7 @@ | |||||||
|         </core-horizontal-scroll-controls> |         </core-horizontal-scroll-controls> | ||||||
|     </div> |     </div> | ||||||
| </ion-item-divider> | </ion-item-divider> | ||||||
| <core-loading [hideUntil]="loaded" [fullscreen]="false"> | <core-loading [hideUntil]="loaded"> | ||||||
|     <core-empty-box *ngIf="courses.length == 0" image="assets/img/icons/courses.svg" |     <core-empty-box *ngIf="courses.length == 0" image="assets/img/icons/courses.svg" | ||||||
|         [message]="'addon.block_starredcourses.nocourses' | translate"></core-empty-box> |         [message]="'addon.block_starredcourses.nocourses' | translate"></core-empty-box> | ||||||
|     <!-- List of courses. --> |     <!-- List of courses. --> | ||||||
|  | |||||||
| @ -3,7 +3,7 @@ | |||||||
|         <h2>{{ 'addon.block_timeline.pluginname' | translate }}</h2> |         <h2>{{ 'addon.block_timeline.pluginname' | translate }}</h2> | ||||||
|     </ion-label> |     </ion-label> | ||||||
| </ion-item-divider> | </ion-item-divider> | ||||||
| <core-loading [hideUntil]="loaded" [fullscreen]="false"> | <core-loading [hideUntil]="loaded"> | ||||||
|     <ion-row class="ion-no-padding ion-justify-content-between ion-align-items-center"> |     <ion-row class="ion-no-padding ion-justify-content-between ion-align-items-center"> | ||||||
|         <ion-col size="auto" class="ion-no-padding"> |         <ion-col size="auto" class="ion-no-padding"> | ||||||
|             <core-combobox [selection]="filter" (onChange)="switchFilter($event)" icon="fas-filter"> |             <core-combobox [selection]="filter" (onChange)="switchFilter($event)" icon="fas-filter"> | ||||||
| @ -57,11 +57,11 @@ | |||||||
|         </ion-col> |         </ion-col> | ||||||
|     </ion-row> |     </ion-row> | ||||||
| 
 | 
 | ||||||
|     <core-loading [hideUntil]="timeline.loaded" [hidden]="sort != 'sortbydates'" [fullscreen]="false"> |     <core-loading [hideUntil]="timeline.loaded" [hidden]="sort != 'sortbydates'"> | ||||||
|         <addon-block-timeline-events [events]="timeline.events" [canLoadMore]="timeline.canLoadMore" (loadMore)="loadMore()" |         <addon-block-timeline-events [events]="timeline.events" [canLoadMore]="timeline.canLoadMore" (loadMore)="loadMore()" | ||||||
|             [from]="dataFrom" [to]="dataTo"></addon-block-timeline-events> |             [from]="dataFrom" [to]="dataTo"></addon-block-timeline-events> | ||||||
|     </core-loading> |     </core-loading> | ||||||
|     <core-loading [hideUntil]="timelineCourses.loaded" [hidden]="sort != 'sortbycourses'" [fullscreen]="false" class="safe-area-page"> |     <core-loading [hideUntil]="timelineCourses.loaded" [hidden]="sort != 'sortbycourses'"> | ||||||
|         <ng-container *ngFor="let course of timelineCourses.courses"> |         <ng-container *ngFor="let course of timelineCourses.courses"> | ||||||
|             <addon-block-timeline-events [events]="course.events" [canLoadMore]="course.canLoadMore" (loadMore)="loadMore(course)" |             <addon-block-timeline-events [events]="course.events" [canLoadMore]="course.canLoadMore" (loadMore)="loadMore(course)" | ||||||
|                 [course]="course" [from]="dataFrom" [to]="dataTo"></addon-block-timeline-events> |                 [course]="course" [from]="dataFrom" [to]="dataTo"></addon-block-timeline-events> | ||||||
|  | |||||||
| @ -11,11 +11,11 @@ | |||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content class="limited-width"> | ||||||
|     <ion-refresher slot="fixed" [disabled]="!loaded" (ionRefresh)="refresh($event.target)"> |     <ion-refresher slot="fixed" [disabled]="!loaded" (ionRefresh)="refresh($event.target)"> | ||||||
|         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> |         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> | ||||||
|     </ion-refresher> |     </ion-refresher> | ||||||
|     <core-loading [hideUntil]="loaded" class="list-item-limited-width"> |     <core-loading [hideUntil]="loaded"> | ||||||
|         <ion-item *ngIf="showMyEntriesToggle"> |         <ion-item *ngIf="showMyEntriesToggle"> | ||||||
|             <ion-label>{{ 'addon.blog.showonlyyourentries' | translate }}</ion-label> |             <ion-label>{{ 'addon.blog.showonlyyourentries' | translate }}</ion-label> | ||||||
|             <ion-toggle [(ngModel)]="onlyMyEntries" (ionChange)="onlyMyEntriesToggleChanged(onlyMyEntries)"></ion-toggle> |             <ion-toggle [(ngModel)]="onlyMyEntries" (ionChange)="onlyMyEntriesToggleChanged(onlyMyEntries)"></ion-toggle> | ||||||
|  | |||||||
| @ -7,7 +7,7 @@ | |||||||
|     </core-context-menu> |     </core-context-menu> | ||||||
| </core-navbar-buttons> | </core-navbar-buttons> | ||||||
| 
 | 
 | ||||||
| <core-loading [hideUntil]="loaded" class="safe-area-padding core-loading-full-height"> | <core-loading [hideUntil]="loaded"> | ||||||
|     <div class="core-swipe-slides-container"> |     <div class="core-swipe-slides-container"> | ||||||
|         <!-- Period name and arrows to navigate. --> |         <!-- Period name and arrows to navigate. --> | ||||||
|         <ion-grid class="ion-no-padding addon-calendar-navigation"> |         <ion-grid class="ion-no-padding addon-calendar-navigation"> | ||||||
|  | |||||||
| @ -1,8 +1,8 @@ | |||||||
| <core-loading [hideUntil]="loaded" class="list-item-limited-width"> | <core-loading [hideUntil]="loaded"> | ||||||
|     <core-empty-box *ngIf="!filteredEvents || !filteredEvents.length" icon="fas-calendar" [message]="'addon.calendar.noevents' | translate"> |     <core-empty-box *ngIf="!filteredEvents || !filteredEvents.length" icon="fas-calendar" [message]="'addon.calendar.noevents' | translate"> | ||||||
|     </core-empty-box> |     </core-empty-box> | ||||||
| 
 | 
 | ||||||
|     <ion-list *ngIf="filteredEvents && filteredEvents.length" class="ion-no-margin"> |     <ion-list *ngIf="filteredEvents && filteredEvents.length" class="list-item-limited-width"> | ||||||
|         <ng-container *ngFor="let event of filteredEvents"> |         <ng-container *ngFor="let event of filteredEvents"> | ||||||
|             <ion-card> |             <ion-card> | ||||||
|                 <ion-item class="ion-text-wrap addon-calendar-event" [attr.aria-label]="event.name" (click)="eventClicked(event)" button |                 <ion-item class="ion-text-wrap addon-calendar-event" [attr.aria-label]="event.name" (click)="eventClicked(event)" button | ||||||
|  | |||||||
| @ -27,7 +27,7 @@ | |||||||
|         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> |         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> | ||||||
|     </ion-refresher> |     </ion-refresher> | ||||||
| 
 | 
 | ||||||
|     <core-loading [hideUntil]="loaded" class="core-loading-full-height"> |     <core-loading [hideUntil]="loaded"> | ||||||
|         <div class="core-swipe-slides-container"> |         <div class="core-swipe-slides-container"> | ||||||
|             <!-- Period name and arrows to navigate. --> |             <!-- Period name and arrows to navigate. --> | ||||||
|             <ion-grid class="ion-no-padding safe-area-padding"> |             <ion-grid class="ion-no-padding safe-area-padding"> | ||||||
| @ -50,9 +50,9 @@ | |||||||
| 
 | 
 | ||||||
|             <core-swipe-slides [manager]="manager"> |             <core-swipe-slides [manager]="manager"> | ||||||
|                 <ng-template let-day="item"> |                 <ng-template let-day="item"> | ||||||
|                     <core-loading [hideUntil]="day.loaded" class="safe-area-padding list-item-limited-width"> |                     <core-loading [hideUntil]="day.loaded"> | ||||||
|                         <!-- There is data to be synchronized --> |                         <!-- There is data to be synchronized --> | ||||||
|                         <ion-card class="core-warning-card" *ngIf="day.hasOffline"> |                         <ion-card class="core-warning-card list-item-limited-width" *ngIf="day.hasOffline"> | ||||||
|                             <ion-item> |                             <ion-item> | ||||||
|                                 <ion-icon name="fas-exclamation-triangle" slot="start" aria-hidden="true"></ion-icon> |                                 <ion-icon name="fas-exclamation-triangle" slot="start" aria-hidden="true"></ion-icon> | ||||||
|                                 <ion-label>{{ 'core.hasdatatosync' | translate:{$a: 'core.day' | translate} }}</ion-label> |                                 <ion-label>{{ 'core.hasdatatosync' | translate:{$a: 'core.day' | translate} }}</ion-label> | ||||||
| @ -63,7 +63,7 @@ | |||||||
|                             [message]="'addon.calendar.noevents' | translate"> |                             [message]="'addon.calendar.noevents' | translate"> | ||||||
|                         </core-empty-box> |                         </core-empty-box> | ||||||
| 
 | 
 | ||||||
|                         <ion-list *ngIf="day.filteredEvents && day.filteredEvents.length" class="ion-no-margin"> |                         <ion-list *ngIf="day.filteredEvents && day.filteredEvents.length" class="list-item-limited-width"> | ||||||
|                             <ng-container *ngFor="let event of day.filteredEvents"> |                             <ng-container *ngFor="let event of day.filteredEvents"> | ||||||
|                                 <ion-card> |                                 <ion-card> | ||||||
|                                     <ion-item class="addon-calendar-event ion-text-wrap" [attr.aria-label]="event.name" |                                     <ion-item class="addon-calendar-event ion-text-wrap" [attr.aria-label]="event.name" | ||||||
|  | |||||||
| @ -10,11 +10,11 @@ | |||||||
|         </ion-title> |         </ion-title> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content [core-swipe-navigation]="competencies"> | <ion-content [core-swipe-navigation]="competencies" class="limited-width"> | ||||||
|     <ion-refresher slot="fixed" [disabled]="!competencyLoaded" (ionRefresh)="refreshCompetency($event.target)"> |     <ion-refresher slot="fixed" [disabled]="!competencyLoaded" (ionRefresh)="refreshCompetency($event.target)"> | ||||||
|         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> |         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> | ||||||
|     </ion-refresher> |     </ion-refresher> | ||||||
|     <core-loading [hideUntil]="competencyLoaded" class="list-item-limited-width"> |     <core-loading [hideUntil]="competencyLoaded"> | ||||||
|         <ion-card *ngIf="user"> |         <ion-card *ngIf="user"> | ||||||
|             <ion-item class="ion-text-wrap"> |             <ion-item class="ion-text-wrap"> | ||||||
|                 <core-user-avatar [user]="user" slot="start"></core-user-avatar> |                 <core-user-avatar [user]="user" slot="start"></core-user-avatar> | ||||||
|  | |||||||
| @ -10,11 +10,11 @@ | |||||||
|         </ion-title> |         </ion-title> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content class="limited-width"> | ||||||
|     <ion-refresher slot="fixed" [disabled]="!competencyLoaded" (ionRefresh)="refreshCompetency($event.target)"> |     <ion-refresher slot="fixed" [disabled]="!competencyLoaded" (ionRefresh)="refreshCompetency($event.target)"> | ||||||
|         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> |         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> | ||||||
|     </ion-refresher> |     </ion-refresher> | ||||||
|     <core-loading [hideUntil]="competencyLoaded" class="list-item-limited-width"> |     <core-loading [hideUntil]="competencyLoaded"> | ||||||
|         <ion-card *ngIf="competency"> |         <ion-card *ngIf="competency"> | ||||||
|             <ion-item class="ion-text-wrap" *ngIf="competency.competency.description"> |             <ion-item class="ion-text-wrap" *ngIf="competency.competency.description"> | ||||||
|                 <ion-label> |                 <ion-label> | ||||||
|  | |||||||
| @ -8,11 +8,11 @@ | |||||||
|         </ion-title> |         </ion-title> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content class="limited-width"> | ||||||
|     <ion-refresher slot="fixed" [disabled]="!competencies.loaded" (ionRefresh)="refreshCourseCompetencies($event.target)"> |     <ion-refresher slot="fixed" [disabled]="!competencies.loaded" (ionRefresh)="refreshCourseCompetencies($event.target)"> | ||||||
|         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> |         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> | ||||||
|     </ion-refresher> |     </ion-refresher> | ||||||
|     <core-loading [hideUntil]="competencies.loaded" class="list-item-limited-width"> |     <core-loading [hideUntil]="competencies.loaded"> | ||||||
|         <ion-card *ngIf="!user && courseCompetencies && courseCompetencies.statistics.competencycount > 0"> |         <ion-card *ngIf="!user && courseCompetencies && courseCompetencies.statistics.competencycount > 0"> | ||||||
|             <ng-container *ngIf="courseCompetencies.cangradecompetencies"> |             <ng-container *ngIf="courseCompetencies.cangradecompetencies"> | ||||||
|                 <ion-item class="ion-text-wrap" *ngIf="courseCompetencies.settings.pushratingstouserplans"> |                 <ion-item class="ion-text-wrap" *ngIf="courseCompetencies.settings.pushratingstouserplans"> | ||||||
|  | |||||||
| @ -8,11 +8,11 @@ | |||||||
|         </ion-title> |         </ion-title> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content [core-swipe-navigation]="plans"> | <ion-content [core-swipe-navigation]="plans" class="limited-width"> | ||||||
|     <ion-refresher slot="fixed" [disabled]="!competencies.loaded" (ionRefresh)="refreshLearningPlan($event.target)"> |     <ion-refresher slot="fixed" [disabled]="!competencies.loaded" (ionRefresh)="refreshLearningPlan($event.target)"> | ||||||
|         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> |         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> | ||||||
|     </ion-refresher> |     </ion-refresher> | ||||||
|     <core-loading [hideUntil]="competencies.loaded" class="list-item-limited-width"> |     <core-loading [hideUntil]="competencies.loaded"> | ||||||
|         <ion-card *ngIf="user"> |         <ion-card *ngIf="user"> | ||||||
|             <ion-item class="ion-text-wrap"> |             <ion-item class="ion-text-wrap"> | ||||||
|                 <ion-label> |                 <ion-label> | ||||||
|  | |||||||
| @ -57,8 +57,8 @@ | |||||||
|         </core-context-menu> |         </core-context-menu> | ||||||
|     </core-navbar-buttons> |     </core-navbar-buttons> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content class="has-footer" (ionScroll)="scrollFunction()"> | <ion-content (ionScroll)="scrollFunction()"> | ||||||
|     <core-loading [hideUntil]="loaded" class="safe-area-padding-horizontal"> |     <core-loading [hideUntil]="loaded"> | ||||||
|         <!-- Load previous messages. --> |         <!-- Load previous messages. --> | ||||||
|         <core-infinite-loading [enabled]="canLoadMore" (action)="loadPrevious($event)" position="top" [error]="loadMoreError"> |         <core-infinite-loading [enabled]="canLoadMore" (action)="loadPrevious($event)" position="top" [error]="loadMoreError"> | ||||||
|         </core-infinite-loading> |         </core-infinite-loading> | ||||||
|  | |||||||
| @ -6,7 +6,7 @@ | |||||||
| </core-navbar-buttons> | </core-navbar-buttons> | ||||||
| 
 | 
 | ||||||
| <!-- Content. --> | <!-- Content. --> | ||||||
| <core-loading [hideUntil]="!showLoading" class="list-item-limited-width"> | <core-loading [hideUntil]="!showLoading"> | ||||||
| 
 | 
 | ||||||
|     <!-- Activity info. --> |     <!-- Activity info. --> | ||||||
|     <core-course-module-info [module]="module" [description]="description" [component]="component" [componentId]="componentId" |     <core-course-module-info [module]="module" [description]="description" [component]="component" [componentId]="componentId" | ||||||
|  | |||||||
| @ -1,316 +1,92 @@ | |||||||
| <core-loading [hideUntil]="loaded" class="list-item-limited-width"> | <core-loading [hideUntil]="loaded"> | ||||||
|  |     <div class="list-item-limited-width"> | ||||||
|  |         <!-- User and status of the submission. --> | ||||||
|  |         <ion-item class="ion-text-wrap" *ngIf="!blindMarking && user" core-user-link [userId]="submitId" [courseId]="courseId" | ||||||
|  |             [attr.aria-label]="user!.fullname"> | ||||||
|  |             <core-user-avatar [user]="user" slot="start" [linkProfile]="false"></core-user-avatar> | ||||||
|  |             <ion-label> | ||||||
|  |                 <h2>{{ user!.fullname }}</h2> | ||||||
|  |                 <ng-container *ngTemplateOutlet="submissionStatus"></ng-container> | ||||||
|  |             </ion-label> | ||||||
|  |         </ion-item> | ||||||
| 
 | 
 | ||||||
|     <!-- User and status of the submission. --> |         <!-- Status of the submission if user is blinded. --> | ||||||
|     <ion-item class="ion-text-wrap" *ngIf="!blindMarking && user" core-user-link [userId]="submitId" [courseId]="courseId" |         <ion-item class="ion-text-wrap" *ngIf="blindMarking && !user"> | ||||||
|         [attr.aria-label]="user!.fullname"> |             <ion-label> | ||||||
|         <core-user-avatar [user]="user" slot="start" [linkProfile]="false"></core-user-avatar> |                 <h2>{{ 'addon.mod_assign.hiddenuser' | translate }} {{blindId}}</h2> | ||||||
|         <ion-label> |                 <ng-container *ngTemplateOutlet="submissionStatus"></ng-container> | ||||||
|             <h2>{{ user!.fullname }}</h2> |             </ion-label> | ||||||
|             <ng-container *ngTemplateOutlet="submissionStatus"></ng-container> |         </ion-item> | ||||||
|         </ion-label> |  | ||||||
|     </ion-item> |  | ||||||
| 
 | 
 | ||||||
|     <!-- Status of the submission if user is blinded. --> |         <!-- Status of the submission in the rest of cases. --> | ||||||
|     <ion-item class="ion-text-wrap" *ngIf="blindMarking && !user"> |         <ion-item class="ion-text-wrap" *ngIf="(blindMarking && user) || (!blindMarking && !user)"> | ||||||
|         <ion-label> |             <ion-label> | ||||||
|             <h2>{{ 'addon.mod_assign.hiddenuser' | translate }} {{blindId}}</h2> |                 <h2>{{ 'addon.mod_assign.submissionstatus' | translate }}</h2> | ||||||
|             <ng-container *ngTemplateOutlet="submissionStatus"></ng-container> |                 <ng-container *ngTemplateOutlet="submissionStatus"></ng-container> | ||||||
|         </ion-label> |             </ion-label> | ||||||
|     </ion-item> |         </ion-item> | ||||||
| 
 | 
 | ||||||
|     <!-- Status of the submission in the rest of cases. --> |         <!-- Tabs: see the submission or grade it. --> | ||||||
|     <ion-item class="ion-text-wrap" *ngIf="(blindMarking && user) || (!blindMarking && !user)"> |         <core-tabs [selectedIndex]="selectedTab" [hideUntil]="loaded" parentScrollable="true" (ionChange)="tabSelected($event)"> | ||||||
|         <ion-label> |             <!-- View the submission tab. --> | ||||||
|             <h2>{{ 'addon.mod_assign.submissionstatus' | translate }}</h2> |             <core-tab [title]="'addon.mod_assign.submission' | translate" id="submission"> | ||||||
|             <ng-container *ngTemplateOutlet="submissionStatus"></ng-container> |                 <ng-template> | ||||||
|         </ion-label> |                     <addon-mod-assign-submission-plugin *ngFor="let plugin of submissionPlugins" [assign]="assign" | ||||||
|     </ion-item> |                         [submission]="userSubmission" [plugin]="plugin"> | ||||||
|  |                     </addon-mod-assign-submission-plugin> | ||||||
| 
 | 
 | ||||||
|     <!-- Tabs: see the submission or grade it. --> |                     <!-- Render some data about the submission. --> | ||||||
|     <core-tabs [selectedIndex]="selectedTab" [hideUntil]="loaded" parentScrollable="true" (ionChange)="tabSelected($event)"> |                     <ion-item class="ion-text-wrap" | ||||||
|         <!-- View the submission tab. --> |                         *ngIf="userSubmission && userSubmission!.status != statusNew && userSubmission!.timemodified"> | ||||||
|         <core-tab [title]="'addon.mod_assign.submission' | translate" id="submission"> |                         <ion-label> | ||||||
|             <ng-template> |                             <h2>{{ 'addon.mod_assign.timemodified' | translate }}</h2> | ||||||
|                 <addon-mod-assign-submission-plugin *ngFor="let plugin of submissionPlugins" [assign]="assign" [submission]="userSubmission" |                             <p>{{ userSubmission!.timemodified * 1000 | coreFormatDate }}</p> | ||||||
|                     [plugin]="plugin"> |                         </ion-label> | ||||||
|                 </addon-mod-assign-submission-plugin> |                     </ion-item> | ||||||
| 
 | 
 | ||||||
|                 <!-- Render some data about the submission. --> |                     <ion-item class="ion-text-wrap" *ngIf="timeRemaining" [ngClass]="[timeRemainingClass]"> | ||||||
|                 <ion-item class="ion-text-wrap" |                         <ion-label> | ||||||
|                     *ngIf="userSubmission && userSubmission!.status != statusNew && userSubmission!.timemodified"> |                             <h2>{{ 'addon.mod_assign.timeremaining' | translate }}</h2> | ||||||
|                     <ion-label> |                             <p [innerHTML]="timeRemaining"></p> | ||||||
|                         <h2>{{ 'addon.mod_assign.timemodified' | translate }}</h2> |                         </ion-label> | ||||||
|                         <p>{{ userSubmission!.timemodified * 1000 | coreFormatDate }}</p> |                     </ion-item> | ||||||
|                     </ion-label> |  | ||||||
|                 </ion-item> |  | ||||||
| 
 | 
 | ||||||
|                 <ion-item class="ion-text-wrap" *ngIf="timeRemaining" [ngClass]="[timeRemainingClass]"> |                     <ion-item class="ion-text-wrap" *ngIf="showDates && fromDate && !isSubmittedForGrading"> | ||||||
|                     <ion-label> |                         <ion-label> | ||||||
|                         <h2>{{ 'addon.mod_assign.timeremaining' | translate }}</h2> |                             <p *ngIf="assign!.intro" | ||||||
|                         <p [innerHTML]="timeRemaining"></p> |                                 [innerHTML]="'addon.mod_assign.allowsubmissionsfromdatesummary' | translate: {'$a': fromDate}"> | ||||||
|                     </ion-label> |                             </p> | ||||||
|                 </ion-item> |                             <p *ngIf="!assign!.intro" [innerHTML]="'addon.mod_assign.allowsubmissionsanddescriptionfromdatesummary' | translate: | ||||||
| 
 |  | ||||||
|                 <ion-item class="ion-text-wrap" *ngIf="showDates && fromDate && !isSubmittedForGrading"> |  | ||||||
|                     <ion-label> |  | ||||||
|                         <p *ngIf="assign!.intro" |  | ||||||
|                             [innerHTML]="'addon.mod_assign.allowsubmissionsfromdatesummary' | translate: {'$a': fromDate}"> |  | ||||||
|                         </p> |  | ||||||
|                         <p *ngIf="!assign!.intro" [innerHTML]="'addon.mod_assign.allowsubmissionsanddescriptionfromdatesummary' | translate: |  | ||||||
|                                 {'$a': fromDate}"> |                                 {'$a': fromDate}"> | ||||||
|                         </p> |  | ||||||
|                     </ion-label> |  | ||||||
|                 </ion-item> |  | ||||||
| 
 |  | ||||||
|                 <ion-item class="ion-text-wrap" *ngIf="showDates && assign!.duedate && !isSubmittedForGrading"> |  | ||||||
|                     <ion-label> |  | ||||||
|                         <h2>{{ 'addon.mod_assign.duedate' | translate }}</h2> |  | ||||||
|                         <p *ngIf="assign!.duedate">{{ assign!.duedate * 1000 | coreFormatDate }}</p> |  | ||||||
|                         <p *ngIf="!assign!.duedate">{{ 'addon.mod_assign.duedateno' | translate }}</p> |  | ||||||
|                     </ion-label> |  | ||||||
|                 </ion-item> |  | ||||||
| 
 |  | ||||||
|                 <ion-item class="ion-text-wrap" *ngIf="assign!.duedate && assign!.cutoffdate && isSubmittedForGrading"> |  | ||||||
|                     <ion-label> |  | ||||||
|                         <h2>{{ 'addon.mod_assign.cutoffdate' | translate }}</h2> |  | ||||||
|                         <p>{{ assign!.cutoffdate * 1000 | coreFormatDate }}</p> |  | ||||||
|                     </ion-label> |  | ||||||
|                 </ion-item> |  | ||||||
| 
 |  | ||||||
|                 <ion-item class="ion-text-wrap" *ngIf="assign!.duedate && lastAttempt?.extensionduedate && !isSubmittedForGrading"> |  | ||||||
|                     <ion-label> |  | ||||||
|                         <h2>{{ 'addon.mod_assign.extensionduedate' | translate }}</h2> |  | ||||||
|                         <p>{{ lastAttempt!.extensionduedate * 1000 | coreFormatDate }}</p> |  | ||||||
|                     </ion-label> |  | ||||||
|                 </ion-item> |  | ||||||
| 
 |  | ||||||
|                 <ion-item class="ion-text-wrap" *ngIf="currentAttempt && !isGrading"> |  | ||||||
|                     <ion-label> |  | ||||||
|                         <h2>{{ 'addon.mod_assign.attemptnumber' | translate }}</h2> |  | ||||||
|                         <p *ngIf="assign!.maxattempts == unlimitedAttempts"> |  | ||||||
|                             {{ 'addon.mod_assign.outof' | translate : |  | ||||||
|                             {'$a': {'current': currentAttempt, 'total': maxAttemptsText} } }} |  | ||||||
|                         </p> |  | ||||||
|                         <p *ngIf="assign!.maxattempts != unlimitedAttempts"> |  | ||||||
|                             {{ 'addon.mod_assign.outof' | translate : |  | ||||||
|                             {'$a': {'current': currentAttempt, 'total': assign!.maxattempts} } }} |  | ||||||
|                         </p> |  | ||||||
|                     </ion-label> |  | ||||||
|                 </ion-item> |  | ||||||
| 
 |  | ||||||
|                 <!-- Add or edit submission. --> |  | ||||||
|                 <ion-item class="ion-text-wrap" *ngIf="canEdit"> |  | ||||||
|                     <ion-label> |  | ||||||
|                         <div *ngIf="!unsupportedEditPlugins.length && !showErrorStatementEdit"> |  | ||||||
|                             <!-- If has offline data, show edit. --> |  | ||||||
|                             <ion-button expand="block" class="ion-text-wrap" *ngIf="hasOffline" (click)="goToEdit()"> |  | ||||||
|                                 {{ 'addon.mod_assign.editsubmission' | translate }} |  | ||||||
|                             </ion-button> |  | ||||||
|                             <!-- If no submission or is new, show add submission. --> |  | ||||||
|                             <ion-button expand="block" class="ion-text-wrap" (click)="goToEdit()" *ngIf="!hasOffline && |  | ||||||
|                                     (!userSubmission || !userSubmission!.status || userSubmission!.status == statusNew)"> |  | ||||||
|                                 {{ 'addon.mod_assign.addsubmission' | translate }} |  | ||||||
|                             </ion-button> |  | ||||||
|                             <!-- If reopened, show addfromprevious and addnewattempt. --> |  | ||||||
|                             <ng-container *ngIf="!hasOffline && userSubmission?.status == statusReopened"> |  | ||||||
|                                 <ion-button *ngIf="!isPreviousAttemptEmpty" expand="block" class="ion-text-wrap" (click)="copyPrevious()"> |  | ||||||
|                                     {{ 'addon.mod_assign.addnewattemptfromprevious' | translate }} |  | ||||||
|                                 </ion-button> |  | ||||||
|                                 <ion-button expand="block" class="ion-text-wrap" (click)="goToEdit()"> |  | ||||||
|                                     {{ 'addon.mod_assign.addnewattempt' | translate }} |  | ||||||
|                                 </ion-button> |  | ||||||
|                             </ng-container> |  | ||||||
|                             <!-- Else show editsubmission. --> |  | ||||||
|                             <ion-button expand="block" class="ion-text-wrap" *ngIf="!hasOffline && |  | ||||||
|                                     userSubmission && userSubmission!.status && |  | ||||||
|                                     userSubmission!.status != statusNew && |  | ||||||
|                                     userSubmission!.status != statusReopened" (click)="goToEdit()"> |  | ||||||
|                                 {{ 'addon.mod_assign.editsubmission' | translate }} |  | ||||||
|                             </ion-button> |  | ||||||
|                         </div> |  | ||||||
|                         <div *ngIf="unsupportedEditPlugins && unsupportedEditPlugins.length && !showErrorStatementEdit"> |  | ||||||
|                             <p class="core-danger-item">{{ 'addon.mod_assign.erroreditpluginsnotsupported' | translate }}</p> |  | ||||||
|                             <p class="core-danger-item" *ngFor="let name of unsupportedEditPlugins">{{ name }}</p> |  | ||||||
|                         </div> |  | ||||||
|                         <div *ngIf="showErrorStatementEdit"> |  | ||||||
|                             <p class="core-danger-item">{{ 'addon.mod_assign.cannoteditduetostatementsubmission' | translate }}</p> |  | ||||||
|                         </div> |  | ||||||
|                     </ion-label> |  | ||||||
|                 </ion-item> |  | ||||||
| 
 |  | ||||||
|                 <!-- Submit for grading form. --> |  | ||||||
|                 <ng-container *ngIf="canSubmit"> |  | ||||||
|                     <ion-item class="ion-text-wrap" *ngIf="submissionStatement"> |  | ||||||
|                         <ion-label> |  | ||||||
|                             <core-format-text [text]="submissionStatement" [filter]="false"></core-format-text> |  | ||||||
|                         </ion-label> |  | ||||||
|                         <ion-checkbox slot="end" name="submissionstatement" [(ngModel)]="acceptStatement"> |  | ||||||
|                         </ion-checkbox> |  | ||||||
|                     </ion-item> |  | ||||||
|                     <!-- Submit button. --> |  | ||||||
|                     <ion-item class="ion-text-wrap" *ngIf="!showErrorStatementSubmit"> |  | ||||||
|                         <ion-label> |  | ||||||
|                             <ion-button expand="block" class="ion-text-wrap" (click)="submitForGrading(acceptStatement)"> |  | ||||||
|                                 {{ 'addon.mod_assign.submitassignment' | translate }} |  | ||||||
|                             </ion-button> |  | ||||||
|                             <p>{{ 'addon.mod_assign.submitassignment_help' | translate }}</p> |  | ||||||
|                         </ion-label> |  | ||||||
|                     </ion-item> |  | ||||||
|                     <!-- Error because we lack submissions statement. --> |  | ||||||
|                     <ion-item class="ion-text-wrap" *ngIf="showErrorStatementSubmit"> |  | ||||||
|                         <ion-label> |  | ||||||
|                             <p class="core-danger-item"> |  | ||||||
|                                 {{ 'addon.mod_assign.cannotsubmitduetostatementsubmission' | translate }} |  | ||||||
|                             </p> |                             </p> | ||||||
|                         </ion-label> |                         </ion-label> | ||||||
|                     </ion-item> |                     </ion-item> | ||||||
|                 </ng-container> |  | ||||||
| 
 | 
 | ||||||
|                 <!-- Team members that need to submit it too. --> |                     <ion-item class="ion-text-wrap" *ngIf="showDates && assign!.duedate && !isSubmittedForGrading"> | ||||||
|                 <ion-item-divider class="ion-text-wrap" *ngIf="membersToSubmit && membersToSubmit.length > 0"> |  | ||||||
|                     <ion-label> |  | ||||||
|                         <h2>{{ 'addon.mod_assign.userswhoneedtosubmit' | translate: {$a: ''} }}</h2> |  | ||||||
|                     </ion-label> |  | ||||||
|                 </ion-item-divider> |  | ||||||
|                 <ng-container *ngIf="membersToSubmit && membersToSubmit.length > 0 && !blindMarking"> |  | ||||||
|                     <ng-container *ngFor="let user of membersToSubmit"> |  | ||||||
|                         <ion-item class="ion-text-wrap" core-user-link [userId]="user.id" [courseId]="courseId" |  | ||||||
|                             [attr.aria-label]="user.fullname"> |  | ||||||
|                             <core-user-avatar [user]="user" slot="start" [linkProfile]="false"></core-user-avatar> |  | ||||||
|                             <ion-label> |  | ||||||
|                                 <h2>{{ user.fullname }}</h2> |  | ||||||
|                             </ion-label> |  | ||||||
|                         </ion-item> |  | ||||||
|                     </ng-container> |  | ||||||
|                 </ng-container> |  | ||||||
|                 <ng-container *ngIf="membersToSubmit && membersToSubmit.length > 0 && blindMarking"> |  | ||||||
|                     <ng-container *ngFor="let blindId of membersToSubmitBlind"> |  | ||||||
|                         <ion-item class="ion-text-wrap"> |  | ||||||
|                             <ion-label>{{ 'addon.mod_assign.hiddenuser' | translate }} {{ blindId }}</ion-label> |  | ||||||
|                         </ion-item> |  | ||||||
|                     </ng-container> |  | ||||||
|                 </ng-container> |  | ||||||
| 
 |  | ||||||
|                 <!-- Submission is locked. --> |  | ||||||
|                 <ion-item class="ion-text-wrap" *ngIf="lastAttempt?.locked"> |  | ||||||
|                     <ion-label> |  | ||||||
|                         <h2>{{ 'addon.mod_assign.submissionslocked' | translate }}</h2> |  | ||||||
|                     </ion-label> |  | ||||||
|                 </ion-item> |  | ||||||
| 
 |  | ||||||
|                 <!-- Editing status. --> |  | ||||||
|                 <ion-item class="ion-text-wrap" *ngIf="lastAttempt && isSubmittedForGrading && lastAttempt!.caneditowner !== undefined" |  | ||||||
|                     [ngClass]="{submissioneditable: lastAttempt!.caneditowner, submissionnoteditable: !lastAttempt!.caneditowner}"> |  | ||||||
|                     <ion-label> |  | ||||||
|                         <h2>{{ 'addon.mod_assign.editingstatus' | translate }}</h2> |  | ||||||
|                         <p *ngIf="lastAttempt!.caneditowner">{{ 'addon.mod_assign.submissioneditable' | translate }}</p> |  | ||||||
|                         <p *ngIf="!lastAttempt!.caneditowner">{{ 'addon.mod_assign.submissionnoteditable' | translate }}</p> |  | ||||||
|                     </ion-label> |  | ||||||
|                 </ion-item> |  | ||||||
|             </ng-template> |  | ||||||
|         </core-tab> |  | ||||||
| 
 |  | ||||||
|         <!-- Grade the submission tab. --> |  | ||||||
|         <core-tab [title]="'addon.mod_assign.grade' | translate" *ngIf="feedback || isGrading" id="grade"> |  | ||||||
|             <ng-template> |  | ||||||
|                 <!-- Current grade if method is advanced. --> |  | ||||||
|                 <ion-item class="ion-text-wrap core-grading-summary" |  | ||||||
|                     *ngIf="feedback?.gradefordisplay && (!isGrading || grade.method != 'simple')"> |  | ||||||
|                     <ion-label> |  | ||||||
|                         <h2>{{ 'addon.mod_assign.currentgrade' | translate }}</h2> |  | ||||||
|                         <p> |  | ||||||
|                             <core-format-text [text]="feedback!.gradefordisplay" [filter]="false"></core-format-text> |  | ||||||
|                         </p> |  | ||||||
|                     </ion-label> |  | ||||||
|                     <ion-button slot="end" *ngIf="feedback!.advancedgrade" (click)="showAdvancedGrade()" |  | ||||||
|                         [attr.aria-label]="'core.showadvanced' |translate"> |  | ||||||
|                         <ion-icon name="fas-search" slot="icon-only" aria-hidden="true"></ion-icon> |  | ||||||
|                     </ion-button> |  | ||||||
|                 </ion-item> |  | ||||||
| 
 |  | ||||||
|                 <ng-container *ngIf="isGrading"> |  | ||||||
|                     <!-- Numeric grade. |  | ||||||
|                         Use a text input because otherwise we cannot readthe value if it has an invalid character. --> |  | ||||||
|                     <ion-item class="ion-text-wrap" *ngIf="grade.method == 'simple' && !grade.scale"> |  | ||||||
|                         <ion-label position="stacked"> |  | ||||||
|                             <h2>{{ 'addon.mod_assign.gradeoutof' | translate: {$a: gradeInfo!.grade} }}</h2> |  | ||||||
|                         </ion-label> |  | ||||||
|                         <ion-input *ngIf="!grade.disabled" type="text" [(ngModel)]="grade.grade" min="0" [max]="gradeInfo!.grade" |  | ||||||
|                             [lang]="grade.lang"> |  | ||||||
|                         </ion-input> |  | ||||||
|                         <p *ngIf="grade.disabled">{{ 'addon.mod_assign.gradelocked' | translate }}</p> |  | ||||||
|                     </ion-item> |  | ||||||
| 
 |  | ||||||
|                     <!-- Grade using a scale. --> |  | ||||||
|                     <ion-item class="ion-text-wrap" *ngIf="grade.method == 'simple' && grade.scale"> |  | ||||||
|                         <ion-label> |                         <ion-label> | ||||||
|                             <h2>{{ 'addon.mod_assign.grade' | translate }}</h2> |                             <h2>{{ 'addon.mod_assign.duedate' | translate }}</h2> | ||||||
|                         </ion-label> |                             <p *ngIf="assign!.duedate">{{ assign!.duedate * 1000 | coreFormatDate }}</p> | ||||||
|                         <ion-select [(ngModel)]="grade.grade" interface="action-sheet" [disabled]="grade.disabled" |                             <p *ngIf="!assign!.duedate">{{ 'addon.mod_assign.duedateno' | translate }}</p> | ||||||
|                             [interfaceOptions]="{header: 'addon.mod_assign.grade' | translate}"> |  | ||||||
|                             <ion-select-option *ngFor="let grade of grade.scale" [value]="grade.value"> |  | ||||||
|                                 {{grade.label}} |  | ||||||
|                             </ion-select-option> |  | ||||||
|                         </ion-select> |  | ||||||
|                     </ion-item> |  | ||||||
| 
 |  | ||||||
|                     <!-- Outcomes. --> |  | ||||||
|                     <ion-item class="ion-text-wrap" *ngFor="let outcome of gradeInfo!.outcomes"> |  | ||||||
|                         <ion-label> |  | ||||||
|                             <h2>{{ outcome.name }}</h2> |  | ||||||
|                         </ion-label> |  | ||||||
|                         <ion-select *ngIf="canSaveGrades && outcome.itemNumber" [(ngModel)]="outcome.selectedId" interface="action-sheet" |  | ||||||
|                             [disabled]="gradeInfo!.disabled" [interfaceOptions]="{header: outcome.name }"> |  | ||||||
|                             <ion-select-option *ngFor="let grade of outcome.options" [value]="grade.value"> |  | ||||||
|                                 {{grade.label}} |  | ||||||
|                             </ion-select-option> |  | ||||||
|                         </ion-select> |  | ||||||
|                         <p *ngIf="!canSaveGrades || !outcome.itemNumber">{{ outcome.selected }}</p> |  | ||||||
|                     </ion-item> |  | ||||||
| 
 |  | ||||||
|                     <!-- Gradebook grade for simple grading. --> |  | ||||||
|                     <ion-item class="ion-text-wrap" *ngIf="grade.method == 'simple'"> |  | ||||||
|                         <ion-label> |  | ||||||
|                             <h2>{{ 'addon.mod_assign.currentgrade' | translate }}</h2> |  | ||||||
|                             <p *ngIf="grade.gradebookGrade && !grade.scale"> |  | ||||||
|                                 {{ grade.gradebookGrade }} |  | ||||||
|                             </p> |  | ||||||
|                             <p *ngIf="grade.gradebookGrade && grade.scale"> |  | ||||||
|                                 {{ grade.scale[grade.gradebookGrade].label }} |  | ||||||
|                             </p> |  | ||||||
|                             <p *ngIf="!grade.gradebookGrade">-</p> |  | ||||||
|                         </ion-label> |                         </ion-label> | ||||||
|                     </ion-item> |                     </ion-item> | ||||||
|                 </ng-container> |  | ||||||
| 
 | 
 | ||||||
|                 <ng-container *ngIf="feedback"> |                     <ion-item class="ion-text-wrap" *ngIf="assign!.duedate && assign!.cutoffdate && isSubmittedForGrading"> | ||||||
|                     <addon-mod-assign-feedback-plugin *ngFor="let plugin of feedback.plugins" [assign]="assign" |  | ||||||
|                         [submission]="userSubmission" [userId]="submitId" [plugin]="plugin" [canEdit]="canSaveGrades"> |  | ||||||
|                     </addon-mod-assign-feedback-plugin> |  | ||||||
|                 </ng-container> |  | ||||||
| 
 |  | ||||||
|                 <!-- Workflow status. --> |  | ||||||
|                 <ion-item class="ion-text-wrap" *ngIf="workflowStatusTranslationId"> |  | ||||||
|                     <ion-label> |  | ||||||
|                         <h2>{{ 'addon.mod_assign.markingworkflowstate' | translate }}</h2> |  | ||||||
|                         <p>{{ workflowStatusTranslationId | translate }}</p> |  | ||||||
|                     </ion-label> |  | ||||||
|                 </ion-item> |  | ||||||
| 
 |  | ||||||
|                 <!--- Apply grade to all team members. --> |  | ||||||
|                 <ion-item class="ion-text-wrap" *ngIf="assign!.teamsubmission && canSaveGrades"> |  | ||||||
|                     <ion-label> |  | ||||||
|                         <h2>{{ 'addon.mod_assign.groupsubmissionsettings' | translate }}</h2> |  | ||||||
|                         <p>{{ 'addon.mod_assign.applytoteam' | translate }}</p> |  | ||||||
|                     </ion-label> |  | ||||||
|                     <ion-toggle [(ngModel)]="grade.applyToAll"></ion-toggle> |  | ||||||
|                 </ion-item> |  | ||||||
| 
 |  | ||||||
|                 <!-- Attempt status. --> |  | ||||||
|                 <ng-container *ngIf="isGrading && assign!.attemptreopenmethod != attemptReopenMethodNone"> |  | ||||||
|                     <ion-item class="ion-text-wrap"> |  | ||||||
|                         <ion-label> |                         <ion-label> | ||||||
|                             <h2>{{ 'addon.mod_assign.attemptsettings' | translate }}</h2> |                             <h2>{{ 'addon.mod_assign.cutoffdate' | translate }}</h2> | ||||||
|  |                             <p>{{ assign!.cutoffdate * 1000 | coreFormatDate }}</p> | ||||||
|  |                         </ion-label> | ||||||
|  |                     </ion-item> | ||||||
|  | 
 | ||||||
|  |                     <ion-item class="ion-text-wrap" *ngIf="assign!.duedate && lastAttempt?.extensionduedate && !isSubmittedForGrading"> | ||||||
|  |                         <ion-label> | ||||||
|  |                             <h2>{{ 'addon.mod_assign.extensionduedate' | translate }}</h2> | ||||||
|  |                             <p>{{ lastAttempt!.extensionduedate * 1000 | coreFormatDate }}</p> | ||||||
|  |                         </ion-label> | ||||||
|  |                     </ion-item> | ||||||
|  | 
 | ||||||
|  |                     <ion-item class="ion-text-wrap" *ngIf="currentAttempt && !isGrading"> | ||||||
|  |                         <ion-label> | ||||||
|  |                             <h2>{{ 'addon.mod_assign.attemptnumber' | translate }}</h2> | ||||||
|                             <p *ngIf="assign!.maxattempts == unlimitedAttempts"> |                             <p *ngIf="assign!.maxattempts == unlimitedAttempts"> | ||||||
|                                 {{ 'addon.mod_assign.outof' | translate : |                                 {{ 'addon.mod_assign.outof' | translate : | ||||||
|                                 {'$a': {'current': currentAttempt, 'total': maxAttemptsText} } }} |                                 {'$a': {'current': currentAttempt, 'total': maxAttemptsText} } }} | ||||||
| @ -319,53 +95,279 @@ | |||||||
|                                 {{ 'addon.mod_assign.outof' | translate : |                                 {{ 'addon.mod_assign.outof' | translate : | ||||||
|                                 {'$a': {'current': currentAttempt, 'total': assign!.maxattempts} } }} |                                 {'$a': {'current': currentAttempt, 'total': assign!.maxattempts} } }} | ||||||
|                             </p> |                             </p> | ||||||
|  |                         </ion-label> | ||||||
|  |                     </ion-item> | ||||||
|  | 
 | ||||||
|  |                     <!-- Add or edit submission. --> | ||||||
|  |                     <ion-item class="ion-text-wrap" *ngIf="canEdit"> | ||||||
|  |                         <ion-label> | ||||||
|  |                             <div *ngIf="!unsupportedEditPlugins.length && !showErrorStatementEdit"> | ||||||
|  |                                 <!-- If has offline data, show edit. --> | ||||||
|  |                                 <ion-button expand="block" class="ion-text-wrap" *ngIf="hasOffline" (click)="goToEdit()"> | ||||||
|  |                                     {{ 'addon.mod_assign.editsubmission' | translate }} | ||||||
|  |                                 </ion-button> | ||||||
|  |                                 <!-- If no submission or is new, show add submission. --> | ||||||
|  |                                 <ion-button expand="block" class="ion-text-wrap" (click)="goToEdit()" *ngIf="!hasOffline && | ||||||
|  |                                     (!userSubmission || !userSubmission!.status || userSubmission!.status == statusNew)"> | ||||||
|  |                                     {{ 'addon.mod_assign.addsubmission' | translate }} | ||||||
|  |                                 </ion-button> | ||||||
|  |                                 <!-- If reopened, show addfromprevious and addnewattempt. --> | ||||||
|  |                                 <ng-container *ngIf="!hasOffline && userSubmission?.status == statusReopened"> | ||||||
|  |                                     <ion-button *ngIf="!isPreviousAttemptEmpty" expand="block" class="ion-text-wrap" | ||||||
|  |                                         (click)="copyPrevious()"> | ||||||
|  |                                         {{ 'addon.mod_assign.addnewattemptfromprevious' | translate }} | ||||||
|  |                                     </ion-button> | ||||||
|  |                                     <ion-button expand="block" class="ion-text-wrap" (click)="goToEdit()"> | ||||||
|  |                                         {{ 'addon.mod_assign.addnewattempt' | translate }} | ||||||
|  |                                     </ion-button> | ||||||
|  |                                 </ng-container> | ||||||
|  |                                 <!-- Else show editsubmission. --> | ||||||
|  |                                 <ion-button expand="block" class="ion-text-wrap" *ngIf="!hasOffline && | ||||||
|  |                                     userSubmission && userSubmission!.status && | ||||||
|  |                                     userSubmission!.status != statusNew && | ||||||
|  |                                     userSubmission!.status != statusReopened" (click)="goToEdit()"> | ||||||
|  |                                     {{ 'addon.mod_assign.editsubmission' | translate }} | ||||||
|  |                                 </ion-button> | ||||||
|  |                             </div> | ||||||
|  |                             <div *ngIf="unsupportedEditPlugins && unsupportedEditPlugins.length && !showErrorStatementEdit"> | ||||||
|  |                                 <p class="core-danger-item">{{ 'addon.mod_assign.erroreditpluginsnotsupported' | translate }}</p> | ||||||
|  |                                 <p class="core-danger-item" *ngFor="let name of unsupportedEditPlugins">{{ name }}</p> | ||||||
|  |                             </div> | ||||||
|  |                             <div *ngIf="showErrorStatementEdit"> | ||||||
|  |                                 <p class="core-danger-item">{{ 'addon.mod_assign.cannoteditduetostatementsubmission' | translate }}</p> | ||||||
|  |                             </div> | ||||||
|  |                         </ion-label> | ||||||
|  |                     </ion-item> | ||||||
|  | 
 | ||||||
|  |                     <!-- Submit for grading form. --> | ||||||
|  |                     <ng-container *ngIf="canSubmit"> | ||||||
|  |                         <ion-item class="ion-text-wrap" *ngIf="submissionStatement"> | ||||||
|  |                             <ion-label> | ||||||
|  |                                 <core-format-text [text]="submissionStatement" [filter]="false"></core-format-text> | ||||||
|  |                             </ion-label> | ||||||
|  |                             <ion-checkbox slot="end" name="submissionstatement" [(ngModel)]="acceptStatement"> | ||||||
|  |                             </ion-checkbox> | ||||||
|  |                         </ion-item> | ||||||
|  |                         <!-- Submit button. --> | ||||||
|  |                         <ion-item class="ion-text-wrap" *ngIf="!showErrorStatementSubmit"> | ||||||
|  |                             <ion-label> | ||||||
|  |                                 <ion-button expand="block" class="ion-text-wrap" (click)="submitForGrading(acceptStatement)"> | ||||||
|  |                                     {{ 'addon.mod_assign.submitassignment' | translate }} | ||||||
|  |                                 </ion-button> | ||||||
|  |                                 <p>{{ 'addon.mod_assign.submitassignment_help' | translate }}</p> | ||||||
|  |                             </ion-label> | ||||||
|  |                         </ion-item> | ||||||
|  |                         <!-- Error because we lack submissions statement. --> | ||||||
|  |                         <ion-item class="ion-text-wrap" *ngIf="showErrorStatementSubmit"> | ||||||
|  |                             <ion-label> | ||||||
|  |                                 <p class="core-danger-item"> | ||||||
|  |                                     {{ 'addon.mod_assign.cannotsubmitduetostatementsubmission' | translate }} | ||||||
|  |                                 </p> | ||||||
|  |                             </ion-label> | ||||||
|  |                         </ion-item> | ||||||
|  |                     </ng-container> | ||||||
|  | 
 | ||||||
|  |                     <!-- Team members that need to submit it too. --> | ||||||
|  |                     <ion-item-divider class="ion-text-wrap" *ngIf="membersToSubmit && membersToSubmit.length > 0"> | ||||||
|  |                         <ion-label> | ||||||
|  |                             <h2>{{ 'addon.mod_assign.userswhoneedtosubmit' | translate: {$a: ''} }}</h2> | ||||||
|  |                         </ion-label> | ||||||
|  |                     </ion-item-divider> | ||||||
|  |                     <ng-container *ngIf="membersToSubmit && membersToSubmit.length > 0 && !blindMarking"> | ||||||
|  |                         <ng-container *ngFor="let user of membersToSubmit"> | ||||||
|  |                             <ion-item class="ion-text-wrap" core-user-link [userId]="user.id" [courseId]="courseId" | ||||||
|  |                                 [attr.aria-label]="user.fullname"> | ||||||
|  |                                 <core-user-avatar [user]="user" slot="start" [linkProfile]="false"></core-user-avatar> | ||||||
|  |                                 <ion-label> | ||||||
|  |                                     <h2>{{ user.fullname }}</h2> | ||||||
|  |                                 </ion-label> | ||||||
|  |                             </ion-item> | ||||||
|  |                         </ng-container> | ||||||
|  |                     </ng-container> | ||||||
|  |                     <ng-container *ngIf="membersToSubmit && membersToSubmit.length > 0 && blindMarking"> | ||||||
|  |                         <ng-container *ngFor="let blindId of membersToSubmitBlind"> | ||||||
|  |                             <ion-item class="ion-text-wrap"> | ||||||
|  |                                 <ion-label>{{ 'addon.mod_assign.hiddenuser' | translate }} {{ blindId }}</ion-label> | ||||||
|  |                             </ion-item> | ||||||
|  |                         </ng-container> | ||||||
|  |                     </ng-container> | ||||||
|  | 
 | ||||||
|  |                     <!-- Submission is locked. --> | ||||||
|  |                     <ion-item class="ion-text-wrap" *ngIf="lastAttempt?.locked"> | ||||||
|  |                         <ion-label> | ||||||
|  |                             <h2>{{ 'addon.mod_assign.submissionslocked' | translate }}</h2> | ||||||
|  |                         </ion-label> | ||||||
|  |                     </ion-item> | ||||||
|  | 
 | ||||||
|  |                     <!-- Editing status. --> | ||||||
|  |                     <ion-item class="ion-text-wrap" *ngIf="lastAttempt && isSubmittedForGrading && lastAttempt!.caneditowner !== undefined" | ||||||
|  |                         [ngClass]="{submissioneditable: lastAttempt!.caneditowner, submissionnoteditable: !lastAttempt!.caneditowner}"> | ||||||
|  |                         <ion-label> | ||||||
|  |                             <h2>{{ 'addon.mod_assign.editingstatus' | translate }}</h2> | ||||||
|  |                             <p *ngIf="lastAttempt!.caneditowner">{{ 'addon.mod_assign.submissioneditable' | translate }}</p> | ||||||
|  |                             <p *ngIf="!lastAttempt!.caneditowner">{{ 'addon.mod_assign.submissionnoteditable' | translate }}</p> | ||||||
|  |                         </ion-label> | ||||||
|  |                     </ion-item> | ||||||
|  |                 </ng-template> | ||||||
|  |             </core-tab> | ||||||
|  | 
 | ||||||
|  |             <!-- Grade the submission tab. --> | ||||||
|  |             <core-tab [title]="'addon.mod_assign.grade' | translate" *ngIf="feedback || isGrading" id="grade"> | ||||||
|  |                 <ng-template> | ||||||
|  |                     <!-- Current grade if method is advanced. --> | ||||||
|  |                     <ion-item class="ion-text-wrap core-grading-summary" | ||||||
|  |                         *ngIf="feedback?.gradefordisplay && (!isGrading || grade.method != 'simple')"> | ||||||
|  |                         <ion-label> | ||||||
|  |                             <h2>{{ 'addon.mod_assign.currentgrade' | translate }}</h2> | ||||||
|                             <p> |                             <p> | ||||||
|                                 {{ 'addon.mod_assign.attemptreopenmethod' | translate }}: |                                 <core-format-text [text]="feedback!.gradefordisplay" [filter]="false"></core-format-text> | ||||||
|                                 {{ 'addon.mod_assign.attemptreopenmethod_' + assign!.attemptreopenmethod | translate }} |  | ||||||
|                             </p> |                             </p> | ||||||
|                         </ion-label> |                         </ion-label> | ||||||
|  |                         <ion-button slot="end" *ngIf="feedback!.advancedgrade" (click)="showAdvancedGrade()" | ||||||
|  |                             [attr.aria-label]="'core.showadvanced' |translate"> | ||||||
|  |                             <ion-icon name="fas-search" slot="icon-only" aria-hidden="true"></ion-icon> | ||||||
|  |                         </ion-button> | ||||||
|                     </ion-item> |                     </ion-item> | ||||||
|                     <ion-item *ngIf="canSaveGrades && allowAddAttempt"> |  | ||||||
|                         <ion-label>{{ 'addon.mod_assign.addattempt' | translate }}</ion-label> |  | ||||||
|                         <ion-toggle [(ngModel)]="grade.addAttempt"></ion-toggle> |  | ||||||
|                     </ion-item> |  | ||||||
|                 </ng-container> |  | ||||||
| 
 | 
 | ||||||
|                 <!-- Data about the grader (teacher who graded). --> |                     <ng-container *ngIf="isGrading"> | ||||||
|                 <ion-item class="ion-text-wrap" *ngIf="grader" core-user-link [userId]="grader!.id" [courseId]="courseId" |                         <!-- Numeric grade. | ||||||
|                     [attr.aria-label]="grader!.fullname" detail="true"> |                         Use a text input because otherwise we cannot readthe value if it has an invalid character. --> | ||||||
|                     <core-user-avatar [user]="grader" slot="start" [linkProfile]="false"></core-user-avatar> |                         <ion-item class="ion-text-wrap" *ngIf="grade.method == 'simple' && !grade.scale"> | ||||||
|                     <ion-label> |                             <ion-label position="stacked"> | ||||||
|                         <h2>{{ 'addon.mod_assign.gradedby' | translate }}</h2> |                                 <h2>{{ 'addon.mod_assign.gradeoutof' | translate: {$a: gradeInfo!.grade} }}</h2> | ||||||
|                         <h2>{{ grader!.fullname }}</h2> |                             </ion-label> | ||||||
|                         <p *ngIf="feedback!.gradeddate">{{ feedback!.gradeddate * 1000 | coreFormatDate }}</p> |                             <ion-input *ngIf="!grade.disabled" type="text" [(ngModel)]="grade.grade" min="0" [max]="gradeInfo!.grade" | ||||||
|                     </ion-label> |                                 [lang]="grade.lang"> | ||||||
|                 </ion-item> |                             </ion-input> | ||||||
|  |                             <p *ngIf="grade.disabled">{{ 'addon.mod_assign.gradelocked' | translate }}</p> | ||||||
|  |                         </ion-item> | ||||||
| 
 | 
 | ||||||
|                 <!-- Grader is hidden, display only the grade date. --> |                         <!-- Grade using a scale. --> | ||||||
|                 <ion-item class="ion-text-wrap" *ngIf="!grader && feedback?.gradeddate"> |                         <ion-item class="ion-text-wrap" *ngIf="grade.method == 'simple' && grade.scale"> | ||||||
|                     <ion-label> |                             <ion-label> | ||||||
|                         <h2>{{ 'addon.mod_assign.gradedon' | translate }}</h2> |                                 <h2>{{ 'addon.mod_assign.grade' | translate }}</h2> | ||||||
|                         <p>{{ feedback!.gradeddate * 1000 | coreFormatDate }}</p> |                             </ion-label> | ||||||
|                     </ion-label> |                             <ion-select [(ngModel)]="grade.grade" interface="action-sheet" [disabled]="grade.disabled" | ||||||
|                 </ion-item> |                                 [interfaceOptions]="{header: 'addon.mod_assign.grade' | translate}"> | ||||||
|  |                                 <ion-select-option *ngFor="let grade of grade.scale" [value]="grade.value"> | ||||||
|  |                                     {{grade.label}} | ||||||
|  |                                 </ion-select-option> | ||||||
|  |                             </ion-select> | ||||||
|  |                         </ion-item> | ||||||
| 
 | 
 | ||||||
|                 <!-- Warning message if cannot save grades. --> |                         <!-- Outcomes. --> | ||||||
|                 <ion-card *ngIf="isGrading && !canSaveGrades" class="core-warning-card"> |                         <ion-item class="ion-text-wrap" *ngFor="let outcome of gradeInfo!.outcomes"> | ||||||
|                     <ion-item> |                             <ion-label> | ||||||
|                         <ion-icon name="fas-exclamation-triangle" slot="start" aria-hidden="true"></ion-icon> |                                 <h2>{{ outcome.name }}</h2> | ||||||
|  |                             </ion-label> | ||||||
|  |                             <ion-select *ngIf="canSaveGrades && outcome.itemNumber" [(ngModel)]="outcome.selectedId" | ||||||
|  |                                 interface="action-sheet" [disabled]="gradeInfo!.disabled" [interfaceOptions]="{header: outcome.name }"> | ||||||
|  |                                 <ion-select-option *ngFor="let grade of outcome.options" [value]="grade.value"> | ||||||
|  |                                     {{grade.label}} | ||||||
|  |                                 </ion-select-option> | ||||||
|  |                             </ion-select> | ||||||
|  |                             <p *ngIf="!canSaveGrades || !outcome.itemNumber">{{ outcome.selected }}</p> | ||||||
|  |                         </ion-item> | ||||||
|  | 
 | ||||||
|  |                         <!-- Gradebook grade for simple grading. --> | ||||||
|  |                         <ion-item class="ion-text-wrap" *ngIf="grade.method == 'simple'"> | ||||||
|  |                             <ion-label> | ||||||
|  |                                 <h2>{{ 'addon.mod_assign.currentgrade' | translate }}</h2> | ||||||
|  |                                 <p *ngIf="grade.gradebookGrade && !grade.scale"> | ||||||
|  |                                     {{ grade.gradebookGrade }} | ||||||
|  |                                 </p> | ||||||
|  |                                 <p *ngIf="grade.gradebookGrade && grade.scale"> | ||||||
|  |                                     {{ grade.scale[grade.gradebookGrade].label }} | ||||||
|  |                                 </p> | ||||||
|  |                                 <p *ngIf="!grade.gradebookGrade">-</p> | ||||||
|  |                             </ion-label> | ||||||
|  |                         </ion-item> | ||||||
|  |                     </ng-container> | ||||||
|  | 
 | ||||||
|  |                     <ng-container *ngIf="feedback"> | ||||||
|  |                         <addon-mod-assign-feedback-plugin *ngFor="let plugin of feedback.plugins" [assign]="assign" | ||||||
|  |                             [submission]="userSubmission" [userId]="submitId" [plugin]="plugin" [canEdit]="canSaveGrades"> | ||||||
|  |                         </addon-mod-assign-feedback-plugin> | ||||||
|  |                     </ng-container> | ||||||
|  | 
 | ||||||
|  |                     <!-- Workflow status. --> | ||||||
|  |                     <ion-item class="ion-text-wrap" *ngIf="workflowStatusTranslationId"> | ||||||
|                         <ion-label> |                         <ion-label> | ||||||
|                             <p>{{ 'addon.mod_assign.cannotgradefromapp' | translate }}</p> |                             <h2>{{ 'addon.mod_assign.markingworkflowstate' | translate }}</h2> | ||||||
|                             <ion-button expand="block" *ngIf="gradeUrl" [href]="gradeUrl" core-link [showBrowserWarning]="false"> |                             <p>{{ workflowStatusTranslationId | translate }}</p> | ||||||
|                                 {{ 'core.openinbrowser' | translate }} |  | ||||||
|                                 <ion-icon name="fas-external-link-alt" slot="end" aria-hidden="true"></ion-icon> |  | ||||||
|                             </ion-button> |  | ||||||
|                         </ion-label> |                         </ion-label> | ||||||
|                     </ion-item> |                     </ion-item> | ||||||
|                 </ion-card> | 
 | ||||||
|             </ng-template> |                     <!--- Apply grade to all team members. --> | ||||||
|         </core-tab> |                     <ion-item class="ion-text-wrap" *ngIf="assign!.teamsubmission && canSaveGrades"> | ||||||
|     </core-tabs> |                         <ion-label> | ||||||
|  |                             <h2>{{ 'addon.mod_assign.groupsubmissionsettings' | translate }}</h2> | ||||||
|  |                             <p>{{ 'addon.mod_assign.applytoteam' | translate }}</p> | ||||||
|  |                         </ion-label> | ||||||
|  |                         <ion-toggle [(ngModel)]="grade.applyToAll"></ion-toggle> | ||||||
|  |                     </ion-item> | ||||||
|  | 
 | ||||||
|  |                     <!-- Attempt status. --> | ||||||
|  |                     <ng-container *ngIf="isGrading && assign!.attemptreopenmethod != attemptReopenMethodNone"> | ||||||
|  |                         <ion-item class="ion-text-wrap"> | ||||||
|  |                             <ion-label> | ||||||
|  |                                 <h2>{{ 'addon.mod_assign.attemptsettings' | translate }}</h2> | ||||||
|  |                                 <p *ngIf="assign!.maxattempts == unlimitedAttempts"> | ||||||
|  |                                     {{ 'addon.mod_assign.outof' | translate : | ||||||
|  |                                     {'$a': {'current': currentAttempt, 'total': maxAttemptsText} } }} | ||||||
|  |                                 </p> | ||||||
|  |                                 <p *ngIf="assign!.maxattempts != unlimitedAttempts"> | ||||||
|  |                                     {{ 'addon.mod_assign.outof' | translate : | ||||||
|  |                                     {'$a': {'current': currentAttempt, 'total': assign!.maxattempts} } }} | ||||||
|  |                                 </p> | ||||||
|  |                                 <p> | ||||||
|  |                                     {{ 'addon.mod_assign.attemptreopenmethod' | translate }}: | ||||||
|  |                                     {{ 'addon.mod_assign.attemptreopenmethod_' + assign!.attemptreopenmethod | translate }} | ||||||
|  |                                 </p> | ||||||
|  |                             </ion-label> | ||||||
|  |                         </ion-item> | ||||||
|  |                         <ion-item *ngIf="canSaveGrades && allowAddAttempt"> | ||||||
|  |                             <ion-label>{{ 'addon.mod_assign.addattempt' | translate }}</ion-label> | ||||||
|  |                             <ion-toggle [(ngModel)]="grade.addAttempt"></ion-toggle> | ||||||
|  |                         </ion-item> | ||||||
|  |                     </ng-container> | ||||||
|  | 
 | ||||||
|  |                     <!-- Data about the grader (teacher who graded). --> | ||||||
|  |                     <ion-item class="ion-text-wrap" *ngIf="grader" core-user-link [userId]="grader!.id" [courseId]="courseId" | ||||||
|  |                         [attr.aria-label]="grader!.fullname" detail="true"> | ||||||
|  |                         <core-user-avatar [user]="grader" slot="start" [linkProfile]="false"></core-user-avatar> | ||||||
|  |                         <ion-label> | ||||||
|  |                             <h2>{{ 'addon.mod_assign.gradedby' | translate }}</h2> | ||||||
|  |                             <h2>{{ grader!.fullname }}</h2> | ||||||
|  |                             <p *ngIf="feedback!.gradeddate">{{ feedback!.gradeddate * 1000 | coreFormatDate }}</p> | ||||||
|  |                         </ion-label> | ||||||
|  |                     </ion-item> | ||||||
|  | 
 | ||||||
|  |                     <!-- Grader is hidden, display only the grade date. --> | ||||||
|  |                     <ion-item class="ion-text-wrap" *ngIf="!grader && feedback?.gradeddate"> | ||||||
|  |                         <ion-label> | ||||||
|  |                             <h2>{{ 'addon.mod_assign.gradedon' | translate }}</h2> | ||||||
|  |                             <p>{{ feedback!.gradeddate * 1000 | coreFormatDate }}</p> | ||||||
|  |                         </ion-label> | ||||||
|  |                     </ion-item> | ||||||
|  | 
 | ||||||
|  |                     <!-- Warning message if cannot save grades. --> | ||||||
|  |                     <ion-card *ngIf="isGrading && !canSaveGrades" class="core-warning-card"> | ||||||
|  |                         <ion-item> | ||||||
|  |                             <ion-icon name="fas-exclamation-triangle" slot="start" aria-hidden="true"></ion-icon> | ||||||
|  |                             <ion-label> | ||||||
|  |                                 <p>{{ 'addon.mod_assign.cannotgradefromapp' | translate }}</p> | ||||||
|  |                                 <ion-button expand="block" *ngIf="gradeUrl" [href]="gradeUrl" core-link [showBrowserWarning]="false"> | ||||||
|  |                                     {{ 'core.openinbrowser' | translate }} | ||||||
|  |                                     <ion-icon name="fas-external-link-alt" slot="end" aria-hidden="true"></ion-icon> | ||||||
|  |                                 </ion-button> | ||||||
|  |                             </ion-label> | ||||||
|  |                         </ion-item> | ||||||
|  |                     </ion-card> | ||||||
|  |                 </ng-template> | ||||||
|  |             </core-tab> | ||||||
|  |         </core-tabs> | ||||||
|  |     </div> | ||||||
| </core-loading> | </core-loading> | ||||||
| 
 | 
 | ||||||
| <!-- Template to render some data regarding the submission status. --> | <!-- Template to render some data regarding the submission status. --> | ||||||
|  | |||||||
| @ -15,7 +15,7 @@ | |||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content class="limited-width"> | ||||||
|     <ion-refresher slot="fixed" [disabled]="activityComponent?.showLoading" (ionRefresh)="activityComponent?.doRefresh($event.target)"> |     <ion-refresher slot="fixed" [disabled]="activityComponent?.showLoading" (ionRefresh)="activityComponent?.doRefresh($event.target)"> | ||||||
|         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> |         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> | ||||||
|     </ion-refresher> |     </ion-refresher> | ||||||
|  | |||||||
| @ -6,7 +6,7 @@ | |||||||
| </core-navbar-buttons> | </core-navbar-buttons> | ||||||
| 
 | 
 | ||||||
| <!-- Content. --> | <!-- Content. --> | ||||||
| <core-loading [hideUntil]="!showLoading" class="safe-area-page list-item-limited-width"> | <core-loading [hideUntil]="!showLoading"> | ||||||
| 
 | 
 | ||||||
|     <!-- Activity info. --> |     <!-- Activity info. --> | ||||||
|     <core-course-module-info [module]="module" [description]="description" [component]="component" [componentId]="componentId" |     <core-course-module-info [module]="module" [description]="description" [component]="component" [componentId]="componentId" | ||||||
|  | |||||||
| @ -14,7 +14,7 @@ | |||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content class="limited-width"> | ||||||
|     <ion-refresher slot="fixed" [disabled]="activityComponent?.showLoading" (ionRefresh)="activityComponent?.doRefresh($event.target)"> |     <ion-refresher slot="fixed" [disabled]="activityComponent?.showLoading" (ionRefresh)="activityComponent?.doRefresh($event.target)"> | ||||||
|         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> |         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> | ||||||
|     </ion-refresher> |     </ion-refresher> | ||||||
|  | |||||||
| @ -6,7 +6,7 @@ | |||||||
| </core-navbar-buttons> | </core-navbar-buttons> | ||||||
| 
 | 
 | ||||||
| <!-- Content. --> | <!-- Content. --> | ||||||
| <core-loading [hideUntil]="!showLoading" class="list-item-limited-width"> | <core-loading [hideUntil]="!showLoading"> | ||||||
| 
 | 
 | ||||||
|     <!-- Activity info. --> |     <!-- Activity info. --> | ||||||
|     <core-course-module-info [module]="module" [description]="description" [component]="component" [componentId]="componentId" |     <core-course-module-info [module]="module" [description]="description" [component]="component" [componentId]="componentId" | ||||||
|  | |||||||
| @ -1,10 +1,4 @@ | |||||||
| :host { | :host { | ||||||
|     core-loading ::ng-deep .core-loading-content { |  | ||||||
|         min-height: 100%; |  | ||||||
|         display: flex; |  | ||||||
|         flex-direction: column; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     .core-swipe-slides-container { |     .core-swipe-slides-container { | ||||||
|         ion-card { |         ion-card { | ||||||
|             flex: none; |             flex: none; | ||||||
|  | |||||||
| @ -14,7 +14,7 @@ | |||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content class="limited-width"> | ||||||
|     <ion-refresher slot="fixed" [disabled]="activityComponent?.showLoading" (ionRefresh)="activityComponent?.doRefresh($event.target)"> |     <ion-refresher slot="fixed" [disabled]="activityComponent?.showLoading" (ionRefresh)="activityComponent?.doRefresh($event.target)"> | ||||||
|         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> |         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> | ||||||
|     </ion-refresher> |     </ion-refresher> | ||||||
|  | |||||||
| @ -6,7 +6,7 @@ | |||||||
| </core-navbar-buttons> | </core-navbar-buttons> | ||||||
| 
 | 
 | ||||||
| <!-- Content. --> | <!-- Content. --> | ||||||
| <core-loading [hideUntil]="!showLoading" class="safe-area-padding list-item-limited-width"> | <core-loading [hideUntil]="!showLoading"> | ||||||
| 
 | 
 | ||||||
|     <!-- Activity info. --> |     <!-- Activity info. --> | ||||||
|     <core-course-module-info [module]="module" [description]="description" [component]="component" [componentId]="componentId" |     <core-course-module-info [module]="module" [description]="description" [component]="component" [componentId]="componentId" | ||||||
|  | |||||||
| @ -16,8 +16,8 @@ | |||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content class="has-footer"> | <ion-content> | ||||||
|     <core-loading [hideUntil]="loaded" class="safe-area-padding"> |     <core-loading [hideUntil]="loaded"> | ||||||
|         <ion-list class="addon-messages-discussion-container" aria-live="polite"> |         <ion-list class="addon-messages-discussion-container" aria-live="polite"> | ||||||
|             <ng-container *ngFor="let message of messages; index as index; last as last"> |             <ng-container *ngFor="let message of messages; index as index; last as last"> | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -14,7 +14,7 @@ | |||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content class="limited-width"> | ||||||
|     <ion-refresher slot="fixed" [disabled]="activityComponent?.showLoading" (ionRefresh)="activityComponent?.doRefresh($event.target)"> |     <ion-refresher slot="fixed" [disabled]="activityComponent?.showLoading" (ionRefresh)="activityComponent?.doRefresh($event.target)"> | ||||||
|         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> |         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> | ||||||
|     </ion-refresher> |     </ion-refresher> | ||||||
|  | |||||||
| @ -12,7 +12,7 @@ | |||||||
|     <ion-refresher slot="fixed" [disabled]="!loaded" (ionRefresh)="refreshMessages($event.target)"> |     <ion-refresher slot="fixed" [disabled]="!loaded" (ionRefresh)="refreshMessages($event.target)"> | ||||||
|         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> |         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> | ||||||
|     </ion-refresher> |     </ion-refresher> | ||||||
|     <core-loading [hideUntil]="loaded" class="safe-area-padding"> |     <core-loading [hideUntil]="loaded"> | ||||||
|         <ion-list class="addon-messages-discussion-container"> |         <ion-list class="addon-messages-discussion-container"> | ||||||
|             <ng-container *ngFor="let message of messages; index as index;"> |             <ng-container *ngFor="let message of messages; index as index;"> | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -7,66 +7,63 @@ | |||||||
| 
 | 
 | ||||||
| <!-- Content. --> | <!-- Content. --> | ||||||
| <core-loading [hideUntil]="!showLoading"> | <core-loading [hideUntil]="!showLoading"> | ||||||
|     <div class="list-item-limited-width"> |     <!-- Activity info. --> | ||||||
|         <!-- Activity info. --> |     <core-course-module-info [module]="module" [description]="description" [component]="component" [componentId]="componentId" | ||||||
|         <core-course-module-info [module]="module" [description]="description" [component]="component" [componentId]="componentId" |         [courseId]="courseId" [hasDataToSync]="hasOffline" (completionChanged)="onCompletionChange()"> | ||||||
|             [courseId]="courseId" [hasDataToSync]="hasOffline" (completionChanged)="onCompletionChange()"> |     </core-course-module-info> | ||||||
|         </core-course-module-info> |  | ||||||
| 
 | 
 | ||||||
|         <!-- Activity availability messages --> |     <!-- Activity availability messages --> | ||||||
|         <ion-card class="core-info-card" *ngIf="choiceNotOpenYet"> |     <ion-card class="core-info-card" *ngIf="choiceNotOpenYet"> | ||||||
|             <ion-item> |         <ion-item> | ||||||
|                 <ion-icon name="fas-info-circle" slot="start" aria-hidden="true"></ion-icon> |             <ion-icon name="fas-info-circle" slot="start" aria-hidden="true"></ion-icon> | ||||||
|  |             <ion-label> | ||||||
|  |                 <p *ngIf="options.length">{{ 'addon.mod_choice.previewonly' | translate:{$a: openTimeReadable} }}</p> | ||||||
|  |                 <p *ngIf="!options.length">{{ 'addon.mod_choice.notopenyet' | translate:{$a: openTimeReadable} }}</p> | ||||||
|  |             </ion-label> | ||||||
|  |         </ion-item> | ||||||
|  |     </ion-card> | ||||||
|  | 
 | ||||||
|  |     <ion-card class="core-info-card" *ngIf="choiceClosed"> | ||||||
|  |         <ion-item> | ||||||
|  |             <ion-icon name="fas-info-circle" slot="start" aria-hidden="true"></ion-icon> | ||||||
|  |             <ion-label> | ||||||
|  |                 <p *ngIf="options.length"> | ||||||
|  |                     {{ 'addon.mod_choice.yourselection' | translate }} | ||||||
|  |                     <core-format-text [text]="options[0].text" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId"> | ||||||
|  |                     </core-format-text> | ||||||
|  |                 </p> | ||||||
|  |                 <p>{{ 'addon.mod_choice.expired' | translate:{$a: closeTimeReadable} }}</p> | ||||||
|  |             </ion-label> | ||||||
|  |         </ion-item> | ||||||
|  |     </ion-card> | ||||||
|  | 
 | ||||||
|  |     <!-- Inform what will happen with the choices. --> | ||||||
|  |     <ion-card class="core-info-card" *ngIf="canEdit && publishInfo && options.length"> | ||||||
|  |         <ion-item> | ||||||
|  |             <ion-icon name="fas-info-circle" slot="start" aria-hidden="true"></ion-icon> | ||||||
|  |             <ion-label>{{ publishInfo | translate }}</ion-label> | ||||||
|  |         </ion-item> | ||||||
|  |     </ion-card> | ||||||
|  | 
 | ||||||
|  |     <!-- Choice options --> | ||||||
|  |     <ion-card *ngIf="options.length && choice"> | ||||||
|  |         <ng-container *ngIf="choice.allowmultiple"> | ||||||
|  |             <ion-item class="ion-text-wrap" *ngFor="let option of options"> | ||||||
|                 <ion-label> |                 <ion-label> | ||||||
|                     <p *ngIf="options.length">{{ 'addon.mod_choice.previewonly' | translate:{$a: openTimeReadable} }}</p> |                     <ng-container *ngTemplateOutlet="optionLabelTemplate; context: {option: option}"></ng-container> | ||||||
|                     <p *ngIf="!options.length">{{ 'addon.mod_choice.notopenyet' | translate:{$a: openTimeReadable} }}</p> |  | ||||||
|                 </ion-label> |                 </ion-label> | ||||||
|  |                 <ion-checkbox slot="end" [(ngModel)]="option.checked" [disabled]="option.disabled || !canEdit"></ion-checkbox> | ||||||
|             </ion-item> |             </ion-item> | ||||||
|         </ion-card> |         </ng-container> | ||||||
| 
 |         <ion-radio-group *ngIf="!choice.allowmultiple" [(ngModel)]="selectedOption.id"> | ||||||
|         <ion-card class="core-info-card" *ngIf="choiceClosed"> |             <ion-item class="ion-text-wrap" *ngFor="let option of options"> | ||||||
|             <ion-item> |  | ||||||
|                 <ion-icon name="fas-info-circle" slot="start" aria-hidden="true"></ion-icon> |  | ||||||
|                 <ion-label> |                 <ion-label> | ||||||
|                     <p *ngIf="options.length"> |                     <ng-container *ngTemplateOutlet="optionLabelTemplate; context: {option: option}"></ng-container> | ||||||
|                         {{ 'addon.mod_choice.yourselection' | translate }} |  | ||||||
|                         <core-format-text [text]="options[0].text" contextLevel="module" [contextInstanceId]="module.id" |  | ||||||
|                             [courseId]="courseId"> |  | ||||||
|                         </core-format-text> |  | ||||||
|                     </p> |  | ||||||
|                     <p>{{ 'addon.mod_choice.expired' | translate:{$a: closeTimeReadable} }}</p> |  | ||||||
|                 </ion-label> |                 </ion-label> | ||||||
|  |                 <ion-radio slot="end" [value]="option.id" [disabled]="option.disabled || !canEdit"></ion-radio> | ||||||
|             </ion-item> |             </ion-item> | ||||||
|         </ion-card> |         </ion-radio-group> | ||||||
| 
 |     </ion-card> | ||||||
|         <!-- Inform what will happen with the choices. --> |  | ||||||
|         <ion-card class="core-info-card" *ngIf="canEdit && publishInfo && options.length"> |  | ||||||
|             <ion-item> |  | ||||||
|                 <ion-icon name="fas-info-circle" slot="start" aria-hidden="true"></ion-icon> |  | ||||||
|                 <ion-label>{{ publishInfo | translate }}</ion-label> |  | ||||||
|             </ion-item> |  | ||||||
|         </ion-card> |  | ||||||
| 
 |  | ||||||
|         <!-- Choice options --> |  | ||||||
|         <ion-card *ngIf="options.length && choice"> |  | ||||||
|             <ng-container *ngIf="choice.allowmultiple"> |  | ||||||
|                 <ion-item class="ion-text-wrap" *ngFor="let option of options"> |  | ||||||
|                     <ion-label> |  | ||||||
|                         <ng-container *ngTemplateOutlet="optionLabelTemplate; context: {option: option}"></ng-container> |  | ||||||
|                     </ion-label> |  | ||||||
|                     <ion-checkbox slot="end" [(ngModel)]="option.checked" [disabled]="option.disabled || !canEdit"></ion-checkbox> |  | ||||||
|                 </ion-item> |  | ||||||
|             </ng-container> |  | ||||||
|             <ion-radio-group *ngIf="!choice.allowmultiple" [(ngModel)]="selectedOption.id"> |  | ||||||
|                 <ion-item class="ion-text-wrap" *ngFor="let option of options"> |  | ||||||
|                     <ion-label> |  | ||||||
|                         <ng-container *ngTemplateOutlet="optionLabelTemplate; context: {option: option}"></ng-container> |  | ||||||
|                     </ion-label> |  | ||||||
|                     <ion-radio slot="end" [value]="option.id" [disabled]="option.disabled || !canEdit"></ion-radio> |  | ||||||
|                 </ion-item> |  | ||||||
|             </ion-radio-group> |  | ||||||
|         </ion-card> |  | ||||||
|     </div> |  | ||||||
|     <!-- Choice results --> |     <!-- Choice results --> | ||||||
|     <div *ngIf="canSeeResults && choice"> |     <div *ngIf="canSeeResults && choice"> | ||||||
|         <ion-item-divider> |         <ion-item-divider> | ||||||
|  | |||||||
| @ -14,7 +14,7 @@ | |||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content class="limited-width"> | ||||||
|     <ion-refresher slot="fixed" [disabled]="activityComponent?.showLoading" (ionRefresh)="activityComponent?.doRefresh($event.target)"> |     <ion-refresher slot="fixed" [disabled]="activityComponent?.showLoading" (ionRefresh)="activityComponent?.doRefresh($event.target)"> | ||||||
|         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> |         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> | ||||||
|     </ion-refresher> |     </ion-refresher> | ||||||
|  | |||||||
| @ -18,7 +18,7 @@ | |||||||
| </core-navbar-buttons> | </core-navbar-buttons> | ||||||
| 
 | 
 | ||||||
| <!-- Content. --> | <!-- Content. --> | ||||||
| <core-loading [hideUntil]="!showLoading" class="list-item-limited-width"> | <core-loading [hideUntil]="!showLoading"> | ||||||
| 
 | 
 | ||||||
|     <!-- Activity info. --> |     <!-- Activity info. --> | ||||||
|     <core-course-module-info [module]="module" [description]="description" [component]="component" [componentId]="componentId" |     <core-course-module-info [module]="module" [description]="description" [component]="component" [componentId]="componentId" | ||||||
|  | |||||||
| @ -11,13 +11,12 @@ | |||||||
|         </ion-title> |         </ion-title> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content class="limited-width"> | ||||||
|     <ion-refresher slot="fixed" [disabled]="!entryLoaded || !(isPullingToRefresh || !renderingEntry && !loadingRating && !loadingComments)" |     <ion-refresher slot="fixed" [disabled]="!entryLoaded || !(isPullingToRefresh || !renderingEntry && !loadingRating && !loadingComments)" | ||||||
|         (ionRefresh)="refreshDatabase($event.target)"> |         (ionRefresh)="refreshDatabase($event.target)"> | ||||||
|         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> |         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> | ||||||
|     </ion-refresher> |     </ion-refresher> | ||||||
|     <core-loading [hideUntil]="entryLoaded && (isPullingToRefresh || !renderingEntry && !loadingRating && !loadingComments)" |     <core-loading [hideUntil]="entryLoaded && (isPullingToRefresh || !renderingEntry && !loadingRating && !loadingComments)"> | ||||||
|         class="list-item-limited-width"> |  | ||||||
|         <!-- Database entries found to be synchronized --> |         <!-- Database entries found to be synchronized --> | ||||||
|         <ion-card class="core-warning-card" *ngIf="entry && entry.hasOffline"> |         <ion-card class="core-warning-card" *ngIf="entry && entry.hasOffline"> | ||||||
|             <ion-item> |             <ion-item> | ||||||
|  | |||||||
| @ -15,7 +15,7 @@ | |||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content class="limited-width"> | ||||||
|     <ion-refresher slot="fixed" [disabled]="activityComponent?.showLoading" (ionRefresh)="activityComponent?.doRefresh($event.target)"> |     <ion-refresher slot="fixed" [disabled]="activityComponent?.showLoading" (ionRefresh)="activityComponent?.doRefresh($event.target)"> | ||||||
|         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> |         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> | ||||||
|     </ion-refresher> |     </ion-refresher> | ||||||
|  | |||||||
| @ -6,7 +6,7 @@ | |||||||
| </core-navbar-buttons> | </core-navbar-buttons> | ||||||
| 
 | 
 | ||||||
| <!-- Content. --> | <!-- Content. --> | ||||||
| <core-loading [hideUntil]="!showLoading" class="list-item-limited-width"> | <core-loading [hideUntil]="!showLoading"> | ||||||
| 
 | 
 | ||||||
|     <!-- Activity info. --> |     <!-- Activity info. --> | ||||||
|     <core-course-module-info [module]="module" [description]="description" [component]="component" [componentId]="componentId" |     <core-course-module-info [module]="module" [description]="description" [component]="component" [componentId]="componentId" | ||||||
|  | |||||||
| @ -11,8 +11,8 @@ | |||||||
|         </ion-title> |         </ion-title> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content class="limited-width"> | ||||||
|     <core-loading [hideUntil]="feedbackLoaded" class="has-spacer list-item-limited-width"> |     <core-loading [hideUntil]="feedbackLoaded" class="has-spacer"> | ||||||
|         <ng-container *ngIf="items && items.length"> |         <ng-container *ngIf="items && items.length"> | ||||||
|             <ion-list class="ion-no-margin has-spacer"> |             <ion-list class="ion-no-margin has-spacer"> | ||||||
|                 <ion-item class="ion-text-wrap"> |                 <ion-item class="ion-text-wrap"> | ||||||
|  | |||||||
| @ -14,7 +14,7 @@ | |||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content class="limited-width"> | ||||||
|     <ion-refresher slot="fixed" [disabled]="activityComponent?.showLoading" (ionRefresh)="activityComponent?.doRefresh($event.target)"> |     <ion-refresher slot="fixed" [disabled]="activityComponent?.showLoading" (ionRefresh)="activityComponent?.doRefresh($event.target)"> | ||||||
|         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> |         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> | ||||||
|     </ion-refresher> |     </ion-refresher> | ||||||
|  | |||||||
| @ -6,7 +6,7 @@ | |||||||
| </core-navbar-buttons> | </core-navbar-buttons> | ||||||
| 
 | 
 | ||||||
| <!-- Content. --> | <!-- Content. --> | ||||||
| <core-loading [hideUntil]="!showLoading" class="list-item-limited-width"> | <core-loading [hideUntil]="!showLoading"> | ||||||
| 
 | 
 | ||||||
|     <!-- Activity info. --> |     <!-- Activity info. --> | ||||||
|     <core-course-module-info *ngIf="!subfolder" [module]="module" [description]="description" [component]="component" |     <core-course-module-info *ngIf="!subfolder" [module]="module" [description]="description" [component]="component" | ||||||
|  | |||||||
| @ -15,7 +15,7 @@ | |||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content class="limited-width"> | ||||||
|     <ion-refresher slot="fixed" [disabled]="subfolder || activityComponent?.showLoading" |     <ion-refresher slot="fixed" [disabled]="subfolder || activityComponent?.showLoading" | ||||||
|         (ionRefresh)="activityComponent?.doRefresh($event.target)"> |         (ionRefresh)="activityComponent?.doRefresh($event.target)"> | ||||||
|         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> |         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> | ||||||
|  | |||||||
| @ -1,11 +1,4 @@ | |||||||
| :host { | core-loading { | ||||||
|     core-loading:not(.core-loading-loaded) > .core-loading-container { |     --loading-inline-min-height: 48px; | ||||||
|         position: relative !important; |     --loading-display-message: none; | ||||||
|         padding-top: 10px !important; |  | ||||||
|         padding-bottom: 10px !important; |  | ||||||
|         overflow: hidden; |  | ||||||
|     } |  | ||||||
|     core-loading > .core-loading-container .core-loading-message { |  | ||||||
|         display: none; |  | ||||||
|     } |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -55,12 +55,12 @@ | |||||||
|         </core-context-menu-item> |         </core-context-menu-item> | ||||||
|     </core-context-menu> |     </core-context-menu> | ||||||
| </core-navbar-buttons> | </core-navbar-buttons> | ||||||
| <ion-content [core-swipe-navigation]="discussions"> | <ion-content [core-swipe-navigation]="discussions" class="limited-width"> | ||||||
|     <ion-refresher slot="fixed" [disabled]="!discussionLoaded" (ionRefresh)="doRefresh($event.target)"> |     <ion-refresher slot="fixed" [disabled]="!discussionLoaded" (ionRefresh)="doRefresh($event.target)"> | ||||||
|         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> |         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> | ||||||
|     </ion-refresher> |     </ion-refresher> | ||||||
| 
 | 
 | ||||||
|     <core-loading [hideUntil]="discussionLoaded" class="list-item-limited-width"> |     <core-loading [hideUntil]="discussionLoaded"> | ||||||
|         <!-- Discussion replies found to be synchronized --> |         <!-- Discussion replies found to be synchronized --> | ||||||
|         <ion-card class="core-warning-card" *ngIf="postHasOffline || hasOfflineRatings"> |         <ion-card class="core-warning-card" *ngIf="postHasOffline || hasOfflineRatings"> | ||||||
|             <ion-item> |             <ion-item> | ||||||
|  | |||||||
| @ -11,12 +11,12 @@ | |||||||
|         </ion-title> |         </ion-title> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content [core-swipe-navigation]="entries"> | <ion-content [core-swipe-navigation]="entries" class="limited-width"> | ||||||
|     <ion-refresher slot="fixed" [disabled]="!loaded" (ionRefresh)="doRefresh($event.target)"> |     <ion-refresher slot="fixed" [disabled]="!loaded" (ionRefresh)="doRefresh($event.target)"> | ||||||
|         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> |         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> | ||||||
|     </ion-refresher> |     </ion-refresher> | ||||||
| 
 | 
 | ||||||
|     <core-loading [hideUntil]="loaded" class="list-item-limited-width"> |     <core-loading [hideUntil]="loaded"> | ||||||
|         <ng-container *ngIf="entry && loaded"> |         <ng-container *ngIf="entry && loaded"> | ||||||
|             <ion-item class="ion-text-wrap" *ngIf="showAuthor"> |             <ion-item class="ion-text-wrap" *ngIf="showAuthor"> | ||||||
|                 <core-user-avatar [user]="entry" slot="start"></core-user-avatar> |                 <core-user-avatar [user]="entry" slot="start"></core-user-avatar> | ||||||
|  | |||||||
| @ -16,7 +16,7 @@ | |||||||
| </core-navbar-buttons> | </core-navbar-buttons> | ||||||
| 
 | 
 | ||||||
| <!-- Content. --> | <!-- Content. --> | ||||||
| <core-loading [hideUntil]="!showLoading" class="safe-area-padding"> | <core-loading [hideUntil]="!showLoading"> | ||||||
| 
 | 
 | ||||||
|     <!-- Activity info. --> |     <!-- Activity info. --> | ||||||
|     <core-course-module-info [module]="module" [description]="description" [component]="component" [componentId]="componentId" |     <core-course-module-info [module]="module" [description]="description" [component]="component" [componentId]="componentId" | ||||||
|  | |||||||
| @ -6,7 +6,7 @@ | |||||||
| </core-navbar-buttons> | </core-navbar-buttons> | ||||||
| 
 | 
 | ||||||
| <!-- Content. --> | <!-- Content. --> | ||||||
| <core-loading [hideUntil]="!showLoading" class="safe-area-padding list-item-limited-width"> | <core-loading [hideUntil]="!showLoading"> | ||||||
| 
 | 
 | ||||||
|     <!-- Activity info. --> |     <!-- Activity info. --> | ||||||
|     <core-course-module-info [module]="module" [description]="description" [component]="component" [componentId]="componentId" |     <core-course-module-info [module]="module" [description]="description" [component]="component" [componentId]="componentId" | ||||||
|  | |||||||
| @ -15,6 +15,6 @@ | |||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content class="limited-width"> | ||||||
|     <addon-mod-imscp-index [module]="module" [courseId]="courseId" (dataRetrieved)="updateData($event)"></addon-mod-imscp-index> |     <addon-mod-imscp-index [module]="module" [courseId]="courseId" (dataRetrieved)="updateData($event)"></addon-mod-imscp-index> | ||||||
| </ion-content> | </ion-content> | ||||||
|  | |||||||
| @ -19,7 +19,7 @@ | |||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content> | ||||||
|     <!-- Content. --> |     <!-- Content. --> | ||||||
|     <core-loading [hideUntil]="loaded" class="safe-area-padding core-loading-full-height"> |     <core-loading [hideUntil]="loaded"> | ||||||
| 
 | 
 | ||||||
|         <ion-card class="core-warning-card" *ngIf="warning"> |         <ion-card class="core-warning-card" *ngIf="warning"> | ||||||
|             <ion-item> |             <ion-item> | ||||||
|  | |||||||
| @ -6,7 +6,7 @@ | |||||||
| </core-navbar-buttons> | </core-navbar-buttons> | ||||||
| 
 | 
 | ||||||
| <!-- Content. --> | <!-- Content. --> | ||||||
| <core-loading [hideUntil]="!showLoading" class="list-item-limited-width"> | <core-loading [hideUntil]="!showLoading"> | ||||||
|     <core-tabs [hideUntil]="!showLoading" [selectedIndex]="selectedTab"> |     <core-tabs [hideUntil]="!showLoading" [selectedIndex]="selectedTab"> | ||||||
|         <!-- Index/Preview tab. --> |         <!-- Index/Preview tab. --> | ||||||
|         <core-tab [title]="'addon.mod_lesson.preview' | translate" (ionSelect)="indexSelected()"> |         <core-tab [title]="'addon.mod_lesson.preview' | translate" (ionSelect)="indexSelected()"> | ||||||
|  | |||||||
| @ -14,7 +14,7 @@ | |||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content class="limited-width"> | ||||||
|     <ion-refresher slot="fixed" [disabled]="activityComponent?.showLoading" (ionRefresh)="activityComponent?.doRefresh($event.target)"> |     <ion-refresher slot="fixed" [disabled]="activityComponent?.showLoading" (ionRefresh)="activityComponent?.doRefresh($event.target)"> | ||||||
|         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> |         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> | ||||||
|     </ion-refresher> |     </ion-refresher> | ||||||
|  | |||||||
| @ -17,8 +17,8 @@ | |||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content class="limited-width"> | ||||||
|     <core-loading [hideUntil]="loaded" class="list-item-limited-width"> |     <core-loading [hideUntil]="loaded"> | ||||||
|         <!-- Info messages. Only show the first one. --> |         <!-- Info messages. Only show the first one. --> | ||||||
|         <ion-card class="core-info-card" *ngIf="lesson && messages?.length"> |         <ion-card class="core-info-card" *ngIf="lesson && messages?.length"> | ||||||
|             <ion-item class="ion-text-wrap"> |             <ion-item class="ion-text-wrap"> | ||||||
|  | |||||||
| @ -8,12 +8,12 @@ | |||||||
|         </ion-title> |         </ion-title> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content class="limited-width"> | ||||||
|     <ion-refresher slot="fixed" [disabled]="!loaded" (ionRefresh)="doRefresh($event.target)"> |     <ion-refresher slot="fixed" [disabled]="!loaded" (ionRefresh)="doRefresh($event.target)"> | ||||||
|         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> |         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> | ||||||
|     </ion-refresher> |     </ion-refresher> | ||||||
| 
 | 
 | ||||||
|     <core-loading [hideUntil]="loaded" class="list-item-limited-width"> |     <core-loading [hideUntil]="loaded"> | ||||||
|         <div *ngIf="student"> |         <div *ngIf="student"> | ||||||
|             <!-- Student data. --> |             <!-- Student data. --> | ||||||
|             <ion-item class="ion-text-wrap" core-user-link [userId]="student.id" [courseId]="courseId" [attr.aria-label]="student.fullname"> |             <ion-item class="ion-text-wrap" core-user-link [userId]="student.id" [courseId]="courseId" [attr.aria-label]="student.fullname"> | ||||||
|  | |||||||
| @ -6,7 +6,7 @@ | |||||||
| </core-navbar-buttons> | </core-navbar-buttons> | ||||||
| 
 | 
 | ||||||
| <!-- Content. --> | <!-- Content. --> | ||||||
| <core-loading [hideUntil]="!showLoading" class="safe-area-padding list-item-limited-width"> | <core-loading [hideUntil]="!showLoading"> | ||||||
| 
 | 
 | ||||||
|     <!-- Activity info. --> |     <!-- Activity info. --> | ||||||
|     <core-course-module-info [module]="module" [description]="displayDescription && description" [component]="component" |     <core-course-module-info [module]="module" [description]="displayDescription && description" [component]="component" | ||||||
|  | |||||||
| @ -15,7 +15,7 @@ | |||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content class="limited-width"> | ||||||
|     <ion-refresher slot="fixed" [disabled]="activityComponent?.showLoading" (ionRefresh)="activityComponent?.doRefresh($event.target)"> |     <ion-refresher slot="fixed" [disabled]="activityComponent?.showLoading" (ionRefresh)="activityComponent?.doRefresh($event.target)"> | ||||||
|         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> |         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> | ||||||
|     </ion-refresher> |     </ion-refresher> | ||||||
|  | |||||||
| @ -6,7 +6,7 @@ | |||||||
| </core-navbar-buttons> | </core-navbar-buttons> | ||||||
| 
 | 
 | ||||||
| <!-- Content. --> | <!-- Content. --> | ||||||
| <core-loading [hideUntil]="!showLoading" class="safe-area-padding list-item-limited-width"> | <core-loading [hideUntil]="!showLoading"> | ||||||
| 
 | 
 | ||||||
|     <!-- Activity info. --> |     <!-- Activity info. --> | ||||||
|     <core-course-module-info [module]="module" [description]="displayDescription && description" [component]="component" |     <core-course-module-info [module]="module" [description]="displayDescription && description" [component]="component" | ||||||
|  | |||||||
| @ -1,8 +0,0 @@ | |||||||
| /* Solves iframe height */ |  | ||||||
| .core-loading-content > div[padding] { |  | ||||||
|     height: 100%; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| core-format-text > .no-overflow { |  | ||||||
|     display: inline; |  | ||||||
| } |  | ||||||
| @ -27,7 +27,6 @@ import { AddonModPageHelper } from '../../services/page-helper'; | |||||||
| @Component({ | @Component({ | ||||||
|     selector: 'addon-mod-page-index', |     selector: 'addon-mod-page-index', | ||||||
|     templateUrl: 'addon-mod-page-index.html', |     templateUrl: 'addon-mod-page-index.html', | ||||||
|     styleUrls: ['index.scss'], |  | ||||||
| }) | }) | ||||||
| export class AddonModPageIndexComponent extends CoreCourseModuleMainResourceComponent implements OnInit { | export class AddonModPageIndexComponent extends CoreCourseModuleMainResourceComponent implements OnInit { | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -14,7 +14,7 @@ | |||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content class="limited-width"> | ||||||
|     <ion-refresher slot="fixed" [disabled]="activityComponent?.showLoading" (ionRefresh)="activityComponent?.doRefresh($event.target)"> |     <ion-refresher slot="fixed" [disabled]="activityComponent?.showLoading" (ionRefresh)="activityComponent?.doRefresh($event.target)"> | ||||||
|         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> |         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> | ||||||
|     </ion-refresher> |     </ion-refresher> | ||||||
|  | |||||||
| @ -6,7 +6,7 @@ | |||||||
| </core-navbar-buttons> | </core-navbar-buttons> | ||||||
| 
 | 
 | ||||||
| <!-- Content. --> | <!-- Content. --> | ||||||
| <core-loading [hideUntil]="!showLoading" class="list-item-limited-width"> | <core-loading [hideUntil]="!showLoading"> | ||||||
| 
 | 
 | ||||||
|     <!-- Activity info. --> |     <!-- Activity info. --> | ||||||
|     <core-course-module-info [module]="module" [description]="description" [component]="component" [componentId]="componentId" |     <core-course-module-info [module]="module" [description]="description" [component]="component" [componentId]="componentId" | ||||||
|  | |||||||
| @ -12,11 +12,11 @@ | |||||||
|         </ion-title> |         </ion-title> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content class="limited-width"> | ||||||
|     <ion-refresher slot="fixed" [disabled]="!loaded" (ionRefresh)="doRefresh($event.target)"> |     <ion-refresher slot="fixed" [disabled]="!loaded" (ionRefresh)="doRefresh($event.target)"> | ||||||
|         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> |         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> | ||||||
|     </ion-refresher> |     </ion-refresher> | ||||||
|     <core-loading [hideUntil]="loaded" class="list-item-limited-width"> |     <core-loading [hideUntil]="loaded"> | ||||||
|         <ion-list *ngIf="attempt"> |         <ion-list *ngIf="attempt"> | ||||||
|             <ion-item class="ion-text-wrap"> |             <ion-item class="ion-text-wrap"> | ||||||
|                 <ion-label> |                 <ion-label> | ||||||
|  | |||||||
| @ -15,7 +15,7 @@ | |||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content class="limited-width"> | ||||||
|     <ion-refresher slot="fixed" [disabled]="activityComponent?.showLoading" (ionRefresh)="activityComponent?.doRefresh($event.target)"> |     <ion-refresher slot="fixed" [disabled]="activityComponent?.showLoading" (ionRefresh)="activityComponent?.doRefresh($event.target)"> | ||||||
|         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> |         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> | ||||||
|     </ion-refresher> |     </ion-refresher> | ||||||
|  | |||||||
| @ -30,8 +30,8 @@ | |||||||
|         </ion-title> |         </ion-title> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content class="limited-width"> | ||||||
|     <core-loading [hideUntil]="loaded" class="has-spacer list-item-limited-width"> |     <core-loading [hideUntil]="loaded" class="has-spacer"> | ||||||
|         <!-- Button to start attempting. --> |         <!-- Button to start attempting. --> | ||||||
|         <ion-button *ngIf="!attempt" expand="block" class="ion-margin" (click)="start()"> |         <ion-button *ngIf="!attempt" expand="block" class="ion-margin" (click)="start()"> | ||||||
|             {{ 'addon.mod_quiz.startattempt' | translate }} |             {{ 'addon.mod_quiz.startattempt' | translate }} | ||||||
|  | |||||||
| @ -15,11 +15,11 @@ | |||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content class="limited-width"> | ||||||
|     <ion-refresher slot="fixed" [disabled]="!loaded" (ionRefresh)="refreshData($event.target)"> |     <ion-refresher slot="fixed" [disabled]="!loaded" (ionRefresh)="refreshData($event.target)"> | ||||||
|         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> |         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> | ||||||
|     </ion-refresher> |     </ion-refresher> | ||||||
|     <core-loading [hideUntil]="loaded" class="list-item-limited-width"> |     <core-loading [hideUntil]="loaded"> | ||||||
| 
 | 
 | ||||||
|         <!-- Review summary --> |         <!-- Review summary --> | ||||||
|         <ion-card *ngIf="attempt"> |         <ion-card *ngIf="attempt"> | ||||||
|  | |||||||
| @ -6,7 +6,7 @@ | |||||||
| </core-navbar-buttons> | </core-navbar-buttons> | ||||||
| 
 | 
 | ||||||
| <!-- Content. --> | <!-- Content. --> | ||||||
| <core-loading [hideUntil]="!showLoading" class="safe-area-padding core-loading-full-height list-item-limited-width"> | <core-loading [hideUntil]="!showLoading"> | ||||||
| 
 | 
 | ||||||
|     <!-- Activity info. --> |     <!-- Activity info. --> | ||||||
|     <core-course-module-info [module]="module" [courseId]="courseId" [description]="displayDescription && description" |     <core-course-module-info [module]="module" [courseId]="courseId" [description]="displayDescription && description" | ||||||
|  | |||||||
| @ -15,7 +15,7 @@ | |||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content class="limited-width"> | ||||||
|     <ion-refresher slot="fixed" [disabled]="activityComponent?.showLoading || activityComponent?.mode == 'iframe'" |     <ion-refresher slot="fixed" [disabled]="activityComponent?.showLoading || activityComponent?.mode == 'iframe'" | ||||||
|         (ionRefresh)="activityComponent?.doRefresh($event.target)"> |         (ionRefresh)="activityComponent?.doRefresh($event.target)"> | ||||||
|         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> |         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> | ||||||
|  | |||||||
| @ -6,7 +6,7 @@ | |||||||
| </core-navbar-buttons> | </core-navbar-buttons> | ||||||
| 
 | 
 | ||||||
| <!-- Content. --> | <!-- Content. --> | ||||||
| <core-loading [hideUntil]="!showLoading" class="safe-area-padding list-item-limited-width"> | <core-loading [hideUntil]="!showLoading"> | ||||||
| 
 | 
 | ||||||
|     <!-- Activity info. --> |     <!-- Activity info. --> | ||||||
|     <core-course-module-info [module]="module" [description]="description" [component]="component" [componentId]="componentId" |     <core-course-module-info [module]="module" [description]="description" [component]="component" [componentId]="componentId" | ||||||
|  | |||||||
| @ -14,7 +14,7 @@ | |||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content class="limited-width"> | ||||||
|     <ion-refresher slot="fixed" [disabled]="activityComponent?.showLoading" (ionRefresh)="activityComponent?.doRefresh($event.target)"> |     <ion-refresher slot="fixed" [disabled]="activityComponent?.showLoading" (ionRefresh)="activityComponent?.doRefresh($event.target)"> | ||||||
|         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> |         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> | ||||||
|     </ion-refresher> |     </ion-refresher> | ||||||
|  | |||||||
| @ -20,7 +20,7 @@ | |||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content> | ||||||
|     <core-loading [hideUntil]="loaded" class="core-loading-full-height"> |     <core-loading [hideUntil]="loaded"> | ||||||
|         <core-iframe *ngIf="loaded && src" [src]="src" [iframeWidth]="scormWidth" [iframeHeight]="scormHeight" |         <core-iframe *ngIf="loaded && src" [src]="src" [iframeWidth]="scormWidth" [iframeHeight]="scormHeight" | ||||||
|             [showFullscreenOnToolbar]="true" [autoFullscreenOnRotate]="true"> |             [showFullscreenOnToolbar]="true" [autoFullscreenOnRotate]="true"> | ||||||
|         </core-iframe> |         </core-iframe> | ||||||
|  | |||||||
| @ -6,7 +6,7 @@ | |||||||
| </core-navbar-buttons> | </core-navbar-buttons> | ||||||
| 
 | 
 | ||||||
| <!-- Content. --> | <!-- Content. --> | ||||||
| <core-loading [hideUntil]="!showLoading" class="safe-area-padding list-item-limited-width"> | <core-loading [hideUntil]="!showLoading"> | ||||||
| 
 | 
 | ||||||
|     <!-- Activity info. --> |     <!-- Activity info. --> | ||||||
|     <core-course-module-info [module]="module" [description]="survey && !survey.surveydone && !hasOffline && description" |     <core-course-module-info [module]="module" [description]="survey && !survey.surveydone && !hasOffline && description" | ||||||
|  | |||||||
| @ -14,7 +14,7 @@ | |||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content class="limited-width"> | ||||||
|     <ion-refresher slot="fixed" [disabled]="activityComponent?.showLoading" (ionRefresh)="activityComponent?.doRefresh($event.target)"> |     <ion-refresher slot="fixed" [disabled]="activityComponent?.showLoading" (ionRefresh)="activityComponent?.doRefresh($event.target)"> | ||||||
|         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> |         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> | ||||||
|     </ion-refresher> |     </ion-refresher> | ||||||
|  | |||||||
| @ -6,7 +6,7 @@ | |||||||
| </core-navbar-buttons> | </core-navbar-buttons> | ||||||
| 
 | 
 | ||||||
| <!-- Content. --> | <!-- Content. --> | ||||||
| <core-loading [hideUntil]="!showLoading" class="list-item-limited-width"> | <core-loading [hideUntil]="!showLoading"> | ||||||
| 
 | 
 | ||||||
|     <!-- Activity info. --> |     <!-- Activity info. --> | ||||||
|     <core-course-module-info [module]="module" [description]="displayDescription && description" [component]="component" |     <core-course-module-info [module]="module" [description]="displayDescription && description" [component]="component" | ||||||
|  | |||||||
| @ -14,7 +14,7 @@ | |||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content class="limited-width"> | ||||||
|     <ion-refresher slot="fixed" [disabled]="activityComponent?.showLoading" (ionRefresh)="activityComponent?.doRefresh($event.target)"> |     <ion-refresher slot="fixed" [disabled]="activityComponent?.showLoading" (ionRefresh)="activityComponent?.doRefresh($event.target)"> | ||||||
|         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> |         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> | ||||||
|     </ion-refresher> |     </ion-refresher> | ||||||
|  | |||||||
| @ -27,7 +27,7 @@ | |||||||
| </core-navbar-buttons> | </core-navbar-buttons> | ||||||
| 
 | 
 | ||||||
| <!-- Content. --> | <!-- Content. --> | ||||||
| <core-loading [hideUntil]="!showLoading" class="list-item-limited-width"> | <core-loading [hideUntil]="!showLoading"> | ||||||
| 
 | 
 | ||||||
|     <!-- Activity info. --> |     <!-- Activity info. --> | ||||||
|     <core-course-module-info [module]="module" [description]="description" [component]="component" [componentId]="componentId" |     <core-course-module-info [module]="module" [description]="description" [component]="component" [componentId]="componentId" | ||||||
|  | |||||||
| @ -15,7 +15,7 @@ | |||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content class="limited-width"> | ||||||
|     <ion-refresher slot="fixed" [disabled]="activityComponent?.showLoading" (ionRefresh)="activityComponent?.doRefresh($event.target)"> |     <ion-refresher slot="fixed" [disabled]="activityComponent?.showLoading" (ionRefresh)="activityComponent?.doRefresh($event.target)"> | ||||||
|         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> |         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> | ||||||
|     </ion-refresher> |     </ion-refresher> | ||||||
|  | |||||||
| @ -1,4 +1,4 @@ | |||||||
| <core-loading [hideUntil]="loaded" class="list-item-limited-width"> | <core-loading [hideUntil]="loaded"> | ||||||
|     <ion-item class="ion-text-wrap" [detail]="canViewAssessment && !canSelfAssess" (click)="gotoAssessment($event)" |     <ion-item class="ion-text-wrap" [detail]="canViewAssessment && !canSelfAssess" (click)="gotoAssessment($event)" | ||||||
|         [button]="canViewAssessment && !canSelfAssess"> |         [button]="canViewAssessment && !canSelfAssess"> | ||||||
|         <core-user-avatar [user]="profile" slot="start" [courseId]="courseId" [userId]="profile?.id"></core-user-avatar> |         <core-user-avatar [user]="profile" slot="start" [courseId]="courseId" [userId]="profile?.id"></core-user-avatar> | ||||||
|  | |||||||
| @ -6,7 +6,7 @@ | |||||||
| </core-navbar-buttons> | </core-navbar-buttons> | ||||||
| 
 | 
 | ||||||
| <!-- Content. --> | <!-- Content. --> | ||||||
| <core-loading [hideUntil]="!showLoading" class="list-item-limited-width"> | <core-loading [hideUntil]="!showLoading"> | ||||||
| 
 | 
 | ||||||
|     <!-- Activity info. --> |     <!-- Activity info. --> | ||||||
|     <core-course-module-info [module]="module" [hasDataToSync]="hasOffline" (completionChanged)="onCompletionChange()"> |     <core-course-module-info [module]="module" [hasDataToSync]="hasOffline" (completionChanged)="onCompletionChange()"> | ||||||
|  | |||||||
| @ -1,4 +1,4 @@ | |||||||
| <core-loading [hideUntil]="loaded" class="list-item-limited-width"> | <core-loading [hideUntil]="loaded"> | ||||||
|     <div *ngIf="!summary"> |     <div *ngIf="!summary"> | ||||||
|         <ion-item class="ion-text-wrap addon-workshop-submission-title"> |         <ion-item class="ion-text-wrap addon-workshop-submission-title"> | ||||||
|             <core-user-avatar [user]="profile" [courseId]="courseId" [userId]="profile?.id" slot="start"> |             <core-user-avatar [user]="profile" [courseId]="courseId" [userId]="profile?.id" slot="start"> | ||||||
|  | |||||||
| @ -14,7 +14,7 @@ | |||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content class="limited-width"> | ||||||
|     <ion-refresher slot="fixed" [disabled]="activityComponent?.showLoading" (ionRefresh)="activityComponent?.doRefresh($event.target)"> |     <ion-refresher slot="fixed" [disabled]="activityComponent?.showLoading" (ionRefresh)="activityComponent?.doRefresh($event.target)"> | ||||||
|         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> |         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> | ||||||
|     </ion-refresher> |     </ion-refresher> | ||||||
|  | |||||||
| @ -20,7 +20,7 @@ | |||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content class="limited-width"> | ||||||
|     <ion-refresher slot="fixed" [disabled]="!loaded" (ionRefresh)="refreshSubmission($event.target)" |     <ion-refresher slot="fixed" [disabled]="!loaded" (ionRefresh)="refreshSubmission($event.target)" | ||||||
|         *ngIf="!((assessmentId && access.assessingallowed) || canAddFeedback)"> |         *ngIf="!((assessmentId && access.assessingallowed) || canAddFeedback)"> | ||||||
|         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> |         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> | ||||||
|  | |||||||
| @ -25,12 +25,12 @@ | |||||||
|             [closeOnClick]="false"></core-context-menu-item> |             [closeOnClick]="false"></core-context-menu-item> | ||||||
|     </core-context-menu> |     </core-context-menu> | ||||||
| </core-navbar-buttons> | </core-navbar-buttons> | ||||||
| <ion-content> | <ion-content class="limited-width"> | ||||||
|     <ion-refresher slot="fixed" [disabled]="!notesLoaded" (ionRefresh)="refreshNotes(false, $event.target)"> |     <ion-refresher slot="fixed" [disabled]="!notesLoaded" (ionRefresh)="refreshNotes(false, $event.target)"> | ||||||
|         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> |         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> | ||||||
|     </ion-refresher> |     </ion-refresher> | ||||||
| 
 | 
 | ||||||
|     <core-loading [hideUntil]="notesLoaded" class="list-item-limited-width"> |     <core-loading [hideUntil]="notesLoaded"> | ||||||
|         <ion-item class="ion-text-wrap" *ngIf="user"> |         <ion-item class="ion-text-wrap" *ngIf="user"> | ||||||
|             <core-user-avatar [user]="user" [courseId]="courseId" slot="start" [linkProfile]="false"></core-user-avatar> |             <core-user-avatar [user]="user" [courseId]="courseId" slot="start" [linkProfile]="false"></core-user-avatar> | ||||||
|             <ion-label> |             <ion-label> | ||||||
|  | |||||||
| @ -8,13 +8,13 @@ | |||||||
|         </ion-title> |         </ion-title> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content class="limited-width"> | ||||||
|     <ion-refresher slot="fixed" [disabled]="!filesLoaded || (!showPrivateFiles && !showSiteFiles)" |     <ion-refresher slot="fixed" [disabled]="!filesLoaded || (!showPrivateFiles && !showSiteFiles)" | ||||||
|         (ionRefresh)="refreshData($event.target)"> |         (ionRefresh)="refreshData($event.target)"> | ||||||
|         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> |         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> | ||||||
|     </ion-refresher> |     </ion-refresher> | ||||||
| 
 | 
 | ||||||
|     <core-loading [hideUntil]="filesLoaded" *ngIf="showPrivateFiles || showSiteFiles" class="list-item-limited-width"> |     <core-loading [hideUntil]="filesLoaded" *ngIf="showPrivateFiles || showSiteFiles"> | ||||||
|         <!-- Allow selecting the files to see: private or site. --> |         <!-- Allow selecting the files to see: private or site. --> | ||||||
|         <core-combobox [selection]="root" (onChange)="rootChanged($event)" *ngIf="showPrivateFiles && showSiteFiles && !path"> |         <core-combobox [selection]="root" (onChange)="rootChanged($event)" *ngIf="showPrivateFiles && showSiteFiles && !path"> | ||||||
|             <ion-select-option class="ion-text-wrap" value="my"> |             <ion-select-option class="ion-text-wrap" value="my"> | ||||||
|  | |||||||
| @ -8,8 +8,8 @@ | |||||||
|         </ion-title> |         </ion-title> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content class="limited-width"> | ||||||
|     <core-loading [hideUntil]="loaded" class="list-item-limited-width"> |     <core-loading [hideUntil]="loaded"> | ||||||
|         <ion-item class="ion-text-wrap"> |         <ion-item class="ion-text-wrap"> | ||||||
|             <ion-label> |             <ion-label> | ||||||
|                 <p>{{ 'addon.storagemanager.courseinfo' | translate }}</p> |                 <p>{{ 'addon.storagemanager.courseinfo' | translate }}</p> | ||||||
|  | |||||||
| @ -8,8 +8,8 @@ | |||||||
|         </ion-title> |         </ion-title> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content class="limited-width"> | ||||||
|     <core-loading [hideUntil]="loaded" class="list-item-limited-width"> |     <core-loading [hideUntil]="loaded"> | ||||||
|         <div class="ion-padding-horizontal ion-text-wrap" *ngIf="spaceUsage"> |         <div class="ion-padding-horizontal ion-text-wrap" *ngIf="spaceUsage"> | ||||||
|             <h2>{{ 'addon.storagemanager.alldata' | translate }}</h2> |             <h2>{{ 'addon.storagemanager.alldata' | translate }}</h2> | ||||||
|         </div> |         </div> | ||||||
|  | |||||||
| @ -1,5 +1,3 @@ | |||||||
| :host { | core-loading { | ||||||
|     core-loading { |     --loading-inline-min-height: 60px; | ||||||
|         --loading-inline-min-height: 60px; |  | ||||||
|     } |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,5 +1,4 @@ | |||||||
| <div [class.core-loading-container]="loading || !safeUrl" [ngStyle]="{'width': iframeWidth, 'height': iframeHeight}"> | <core-loading [hideUntil]="!loading && safeUrl"> | ||||||
| 
 |  | ||||||
|     <core-navbar-buttons slot="end" prepend *ngIf="initialized && showFullscreenOnToolbar"> |     <core-navbar-buttons slot="end" prepend *ngIf="initialized && showFullscreenOnToolbar"> | ||||||
|         <ion-button fill="clear" (click)="toggleFullscreen()" |         <ion-button fill="clear" (click)="toggleFullscreen()" | ||||||
|             [attr.aria-label]="(fullscreen ? 'core.disablefullscreen' : 'core.fullscreen') | translate"> |             [attr.aria-label]="(fullscreen ? 'core.disablefullscreen' : 'core.fullscreen') | translate"> | ||||||
| @ -17,8 +16,4 @@ | |||||||
|         class="core-button-as-link core-iframe-help"> |         class="core-button-as-link core-iframe-help"> | ||||||
|         {{ 'core.iframehelp' | translate }} |         {{ 'core.iframehelp' | translate }} | ||||||
|     </ion-button> |     </ion-button> | ||||||
| 
 | </core-loading> | ||||||
|     <span class="core-loading-spinner"> |  | ||||||
|         <ion-spinner *ngIf="loading" [attr.aria-label]="'core.loading' | translate"></ion-spinner> |  | ||||||
|     </span> |  | ||||||
| </div> |  | ||||||
|  | |||||||
| @ -9,27 +9,6 @@ | |||||||
|         max-width: 100%; |         max-width: 100%; | ||||||
|         background-color: var(--ion-background-color); |         background-color: var(--ion-background-color); | ||||||
|     } |     } | ||||||
| 
 |  | ||||||
|     .core-loading-container { |  | ||||||
|         position: absolute; |  | ||||||
|         top: 0; |  | ||||||
|         bottom: 0; |  | ||||||
|         left: 0; |  | ||||||
|         right: 0; |  | ||||||
|         display: table; |  | ||||||
|         height: 100%; |  | ||||||
|         width: 100%; |  | ||||||
|         z-index: 1; |  | ||||||
|         margin: 0; |  | ||||||
|         padding: 0; |  | ||||||
|         clear: both; |  | ||||||
| 
 |  | ||||||
|         .core-loading-spinner { |  | ||||||
|             display: table-cell; |  | ||||||
|             text-align: center; |  | ||||||
|             vertical-align: middle; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| :host-context(.core-iframe-fullscreen) { | :host-context(.core-iframe-fullscreen) { | ||||||
|  | |||||||
| @ -1,4 +1,6 @@ | |||||||
| <core-dynamic-component [component]="componentClass" [data]="data"></core-dynamic-component> | <div class="list-item-limited-width"> | ||||||
|  |     <core-dynamic-component [component]="componentClass" [data]="data"></core-dynamic-component> | ||||||
|  | </div> | ||||||
| 
 | 
 | ||||||
| <core-block-side-blocks-button slot="fixed" *ngIf="course && hasBlocks" [courseId]="course.id"> | <core-block-side-blocks-button slot="fixed" *ngIf="course && hasBlocks" [courseId]="course.id"> | ||||||
| </core-block-side-blocks-button> | </core-block-side-blocks-button> | ||||||
|  | |||||||
| @ -18,11 +18,11 @@ | |||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content class="limited-width"> | ||||||
|     <ion-refresher slot="fixed" [disabled]="!loaded" (ionRefresh)="doRefresh($event.target)"> |     <ion-refresher slot="fixed" [disabled]="!loaded" (ionRefresh)="doRefresh($event.target)"> | ||||||
|         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> |         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> | ||||||
|     </ion-refresher> |     </ion-refresher> | ||||||
|     <core-loading [hideUntil]="loaded" class="has-spacer list-item-limited-width"> |     <core-loading [hideUntil]="loaded" class="has-spacer"> | ||||||
|         <core-course-module-info [module]="module" [courseId]="courseId" [description]="module.description" [component]="module.modname" |         <core-course-module-info [module]="module" [courseId]="courseId" [description]="module.description" [component]="module.modname" | ||||||
|             [componentId]="module.id" [expandDescription]="true" [showAvailabilityInfo]="true" (completionChanged)="onCompletionChange()" |             [componentId]="module.id" [expandDescription]="true" [showAvailabilityInfo]="true" (completionChanged)="onCompletionChange()" | ||||||
|             [showManualCompletion]="showManualCompletion"> |             [showManualCompletion]="showManualCompletion"> | ||||||
|  | |||||||
| @ -12,7 +12,7 @@ | |||||||
|     <ion-refresher slot="fixed" [disabled]="!columns || !rows" (ionRefresh)="refreshGrades($event.target)"> |     <ion-refresher slot="fixed" [disabled]="!columns || !rows" (ionRefresh)="refreshGrades($event.target)"> | ||||||
|         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> |         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> | ||||||
|     </ion-refresher> |     </ion-refresher> | ||||||
|     <core-loading [hideUntil]="columns && rows" class="safe-area-padding"> |     <core-loading [hideUntil]="columns && rows"> | ||||||
|         <core-empty-box *ngIf="rows && rows.length === 0" icon="fas-chart-bar" [message]="'core.grades.nogradesreturned' | translate"> |         <core-empty-box *ngIf="rows && rows.length === 0" icon="fas-chart-bar" [message]="'core.grades.nogradesreturned' | translate"> | ||||||
|         </core-empty-box> |         </core-empty-box> | ||||||
|         <div *ngIf="rows && rows.length > 0" class="core-grades-container"> |         <div *ngIf="rows && rows.length > 0" class="core-grades-container"> | ||||||
|  | |||||||
| @ -1,4 +1,4 @@ | |||||||
| <core-loading [hideUntil]="iframeSrc" [fullscreen]="false" class="safe-area-padding"> | <core-loading [hideUntil]="iframeSrc" [fullscreen]="false"> | ||||||
|     <core-iframe *ngIf="iframeSrc" [src]="iframeSrc" iframeHeight="auto" [allowFullscreen]="true" (loaded)="iframeLoaded()" |     <core-iframe *ngIf="iframeSrc" [src]="iframeSrc" iframeHeight="auto" [allowFullscreen]="true" (loaded)="iframeLoaded()" | ||||||
|         [showFullscreenOnToolbar]="enableInAppFullscreen" [autoFullscreenOnRotate]="enableInAppFullscreen"> |         [showFullscreenOnToolbar]="enableInAppFullscreen" [autoFullscreenOnRotate]="enableInAppFullscreen"> | ||||||
|     </core-iframe> |     </core-iframe> | ||||||
|  | |||||||
| @ -15,8 +15,8 @@ | |||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content class="ion-padding"> | <ion-content class="ion-padding limited-width"> | ||||||
|     <core-loading [hideUntil]="pageLoaded" class="list-item-limited-width"> |     <core-loading [hideUntil]="pageLoaded"> | ||||||
|         <div class="ion-text-wrap ion-text-center ion-margin-bottom"> |         <div class="ion-text-wrap ion-text-center ion-margin-bottom"> | ||||||
|             <div class="core-login-site-logo"> |             <div class="core-login-site-logo"> | ||||||
|                 <!-- Show site logo or a default image. --> |                 <!-- Show site logo or a default image. --> | ||||||
|  | |||||||
| @ -10,7 +10,7 @@ | |||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content> | ||||||
|     <core-loading [hideUntil]="policyLoaded" class="core-loading-full-height"> |     <core-loading [hideUntil]="policyLoaded"> | ||||||
|         <ion-list *ngIf="sitePolicy"> |         <ion-list *ngIf="sitePolicy"> | ||||||
|             <ion-item class="ion-text-wrap"> |             <ion-item class="ion-text-wrap"> | ||||||
|                 <ion-label> |                 <ion-label> | ||||||
|  | |||||||
| @ -19,8 +19,8 @@ | |||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content class="limited-width"> | ||||||
|     <core-loading [hideUntil]="loaded" class="list-item-limited-width"> |     <core-loading [hideUntil]="loaded"> | ||||||
|         <ion-list class="core-sitelist"> |         <ion-list class="core-sitelist"> | ||||||
|             <ion-card *ngFor="let sites of accountsList.otherSites"> |             <ion-card *ngFor="let sites of accountsList.otherSites"> | ||||||
|                 <ion-item-divider sticky="true" *ngIf="sites[0]" class="core-sitelist-sitename"> |                 <ion-item-divider sticky="true" *ngIf="sites[0]" class="core-sitelist-sitename"> | ||||||
|  | |||||||
| @ -9,8 +9,8 @@ | |||||||
|         </ion-title> |         </ion-title> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content class="limited-width"> | ||||||
|     <core-loading [hideUntil]="loaded" class="list-item-limited-width"> |     <core-loading [hideUntil]="loaded"> | ||||||
|         <ion-searchbar [(ngModel)]="textFilter" (ionInput)="filterChanged($event.target)" (ionCancel)="filterChanged($event.target)" |         <ion-searchbar [(ngModel)]="textFilter" (ionInput)="filterChanged($event.target)" (ionCancel)="filterChanged($event.target)" | ||||||
|             [placeholder]="'core.filter' | translate"> |             [placeholder]="'core.filter' | translate"> | ||||||
|         </ion-searchbar> |         </ion-searchbar> | ||||||
|  | |||||||
| @ -12,11 +12,11 @@ | |||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content class="limited-width"> | ||||||
|     <ion-refresher [disabled]="!loaded" (ionRefresh)="refreshData($event.target)" slot="fixed"> |     <ion-refresher [disabled]="!loaded" (ionRefresh)="refreshData($event.target)" slot="fixed"> | ||||||
|         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> |         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> | ||||||
|     </ion-refresher> |     </ion-refresher> | ||||||
|     <core-loading [hideUntil]="loaded" class="list-item-limited-width"> |     <core-loading [hideUntil]="loaded"> | ||||||
|         <ion-list> |         <ion-list> | ||||||
|             <ion-item *ngFor="let site of sites" [class.item-current]="site.id == currentSiteId"> |             <ion-item *ngFor="let site of sites" [class.item-current]="site.id == currentSiteId"> | ||||||
|                 <ion-label class="ion-text-wrap"> |                 <ion-label class="ion-text-wrap"> | ||||||
|  | |||||||
| @ -15,8 +15,8 @@ | |||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content class="limited-width"> | ||||||
|     <core-loading [hideUntil]="sitesLoaded" class="list-item-limited-width"> |     <core-loading [hideUntil]="sitesLoaded"> | ||||||
|         <ion-list> |         <ion-list> | ||||||
|             <ion-item-divider> |             <ion-item-divider> | ||||||
|                 <ion-label> |                 <ion-label> | ||||||
|  | |||||||
| @ -10,14 +10,12 @@ | |||||||
|         </ion-title> |         </ion-title> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content class="limited-width"> | ||||||
|     <ion-refresher slot="fixed" [disabled]="!loaded" (ionRefresh)="refreshData($event.target)"> |     <ion-refresher slot="fixed" [disabled]="!loaded" (ionRefresh)="refreshData($event.target)"> | ||||||
|         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> |         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> | ||||||
|     </ion-refresher> |     </ion-refresher> | ||||||
|     <core-loading [hideUntil]="loaded" class="list-item-limited-width"> |     <core-loading [hideUntil]="loaded"> | ||||||
|         <ng-container *ngIf="loaded"> |         <core-dynamic-component [component]="areaComponent" [data]="{items: items}"></core-dynamic-component> | ||||||
|             <core-dynamic-component [component]="areaComponent" [data]="{items: items}"></core-dynamic-component> |  | ||||||
|         </ng-container> |  | ||||||
|         <core-infinite-loading [enabled]="canLoadMore" (action)="loadMore($event)" [error]="loadMoreError"> |         <core-infinite-loading [enabled]="canLoadMore" (action)="loadMore($event)" [error]="loadMoreError"> | ||||||
|         </core-infinite-loading> |         </core-infinite-loading> | ||||||
|     </core-loading> |     </core-loading> | ||||||
|  | |||||||
| @ -32,7 +32,7 @@ | |||||||
|             </ion-col> |             </ion-col> | ||||||
|         </ion-row> |         </ion-row> | ||||||
|     </ion-grid> |     </ion-grid> | ||||||
|     <core-loading [hideUntil]="loaded && !searching" class="safe-area-padding"> |     <core-loading [hideUntil]="loaded && !searching"> | ||||||
|         <core-empty-box *ngIf="!cloud || !cloud!.tags || !cloud!.tags.length" icon="fas-tags" |         <core-empty-box *ngIf="!cloud || !cloud!.tags || !cloud!.tags.length" icon="fas-tags" | ||||||
|             [message]="'core.tag.notagsfound' | translate: {$a: query}"></core-empty-box> |             [message]="'core.tag.notagsfound' | translate: {$a: query}"></core-empty-box> | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -8,11 +8,11 @@ | |||||||
|         </ion-title> |         </ion-title> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content class="limited-width"> | ||||||
|     <ion-refresher slot="fixed" [disabled]="!userLoaded" (ionRefresh)="refreshUser($event.target)"> |     <ion-refresher slot="fixed" [disabled]="!userLoaded" (ionRefresh)="refreshUser($event.target)"> | ||||||
|         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> |         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> | ||||||
|     </ion-refresher> |     </ion-refresher> | ||||||
|     <core-loading [hideUntil]="userLoaded" class="list-item-limited-width"> |     <core-loading [hideUntil]="userLoaded"> | ||||||
|         <ion-list *ngIf="user"> |         <ion-list *ngIf="user"> | ||||||
|             <ion-item class="ion-text-center core-user-profile-maininfo ion-text-wrap" lines="full"> |             <ion-item class="ion-text-center core-user-profile-maininfo ion-text-wrap" lines="full"> | ||||||
|                 <core-user-avatar [user]="user" [userId]="user.id" [linkProfile]="false" [checkOnline]="!canChangeProfilePicture"> |                 <core-user-avatar [user]="user" [userId]="user.id" [linkProfile]="false" [checkOnline]="!canChangeProfilePicture"> | ||||||
|  | |||||||
| @ -8,11 +8,11 @@ | |||||||
|         </ion-title> |         </ion-title> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content [core-swipe-navigation]="users"> | <ion-content [core-swipe-navigation]="users" class="limited-width"> | ||||||
|     <ion-refresher slot="fixed" [disabled]="!userLoaded" (ionRefresh)="refreshUser($event.target)"> |     <ion-refresher slot="fixed" [disabled]="!userLoaded" (ionRefresh)="refreshUser($event.target)"> | ||||||
|         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> |         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> | ||||||
|     </ion-refresher> |     </ion-refresher> | ||||||
|     <core-loading [hideUntil]="userLoaded" class="list-item-limited-width"> |     <core-loading [hideUntil]="userLoaded"> | ||||||
|         <ion-list *ngIf="user && !isDeleted && isEnrolled"> |         <ion-list *ngIf="user && !isDeleted && isEnrolled"> | ||||||
|             <ion-item class="ion-text-center core-user-profile-maininfo ion-text-wrap"> |             <ion-item class="ion-text-center core-user-profile-maininfo ion-text-wrap"> | ||||||
|                 <core-user-avatar [user]="user" [userId]="user.id" [linkProfile]="false" [checkOnline]="true"> |                 <core-user-avatar [user]="user" [userId]="user.id" [linkProfile]="false" [checkOnline]="true"> | ||||||
|  | |||||||
| @ -817,12 +817,18 @@ ion-card { | |||||||
| 
 | 
 | ||||||
| ion-list.core-course-module-list-wrapper, | ion-list.core-course-module-list-wrapper, | ||||||
| .list-item-limited-width, | .list-item-limited-width, | ||||||
| .core-course-module-list-wrapper { | .core-course-module-list-wrapper, | ||||||
|  | ion-content.limited-width > :not([slot]) { | ||||||
|     max-width: var(--list-item-max-width); |     max-width: var(--list-item-max-width); | ||||||
|     margin-left: auto !important; |     margin-left: auto !important; | ||||||
|     margin-right: auto !important; |     margin-right: auto !important; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | ion-content.limited-width > :not([slot]) { | ||||||
|  |     display: flex; | ||||||
|  |     flex-direction: column; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| ion-toolbar h1 img.core-bar-button-image, | ion-toolbar h1 img.core-bar-button-image, | ||||||
| ion-toolbar h1 .core-bar-button-image img { | ion-toolbar h1 .core-bar-button-image img { | ||||||
|     padding: 4px; |     padding: 4px; | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user