forked from CIT/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