MOBILE-3810 core: Wrap header titles with ion-title
This commit is contained in:
		
							parent
							
								
									d8718c5eaa
								
							
						
					
					
						commit
						ccfad3b1ac
					
				| @ -3,8 +3,10 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1 *ngIf="badge">{{ badge.name }}</h1> |             <h1 *ngIf="badge">{{ badge.name }}</h1> | ||||||
|             <h1 *ngIf="!badge">{{ 'addon.badges.badges' | translate }}</h1> |             <h1 *ngIf="!badge">{{ 'addon.badges.badges' | translate }}</h1> | ||||||
|  |         </ion-title> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content> | ||||||
| @ -157,7 +159,9 @@ | |||||||
|             <!-- Endorsement --> |             <!-- Endorsement --> | ||||||
|             <ion-item-group *ngIf="badge.endorsement"> |             <ion-item-group *ngIf="badge.endorsement"> | ||||||
|                 <ion-item-divider> |                 <ion-item-divider> | ||||||
|                     <ion-label><h2>{{ 'addon.badges.bendorsement' | translate}}</h2></ion-label> |                     <ion-label> | ||||||
|  |                         <h2>{{ 'addon.badges.bendorsement' | translate}}</h2> | ||||||
|  |                     </ion-label> | ||||||
|                 </ion-item-divider> |                 </ion-item-divider> | ||||||
|                 <ion-item class="ion-text-wrap" *ngIf="badge.endorsement.issuername"> |                 <ion-item class="ion-text-wrap" *ngIf="badge.endorsement.issuername"> | ||||||
|                     <ion-label> |                     <ion-label> | ||||||
| @ -169,8 +173,7 @@ | |||||||
|                     <ion-label> |                     <ion-label> | ||||||
|                         <h2>{{ 'addon.badges.issueremail' | translate}}</h2> |                         <h2>{{ 'addon.badges.issueremail' | translate}}</h2> | ||||||
|                         <p> |                         <p> | ||||||
|                             <a href="mailto:{{badge.endorsement.issueremail}}" core-link auto-login="no" |                             <a href="mailto:{{badge.endorsement.issueremail}}" core-link auto-login="no" [showBrowserWarning]="false"> | ||||||
|                                 [showBrowserWarning]="false"> |  | ||||||
|                                 {{ badge.endorsement.issueremail }} |                                 {{ badge.endorsement.issueremail }} | ||||||
|                             </a> |                             </a> | ||||||
|                         </p> |                         </p> | ||||||
| @ -205,27 +208,39 @@ | |||||||
|             <!-- Related badges --> |             <!-- Related badges --> | ||||||
|             <ion-item-group *ngIf="badge.relatedbadges"> |             <ion-item-group *ngIf="badge.relatedbadges"> | ||||||
|                 <ion-item-divider> |                 <ion-item-divider> | ||||||
|                     <ion-label><h2>{{ 'addon.badges.relatedbages' | translate}}</h2></ion-label> |                     <ion-label> | ||||||
|  |                         <h2>{{ 'addon.badges.relatedbages' | translate}}</h2> | ||||||
|  |                     </ion-label> | ||||||
|                 </ion-item-divider> |                 </ion-item-divider> | ||||||
|                 <ion-item class="ion-text-wrap" *ngFor="let relatedBadge of badge.relatedbadges"> |                 <ion-item class="ion-text-wrap" *ngFor="let relatedBadge of badge.relatedbadges"> | ||||||
|                     <ion-label><h2>{{ relatedBadge.name }}</h2></ion-label> |                     <ion-label> | ||||||
|  |                         <h2>{{ relatedBadge.name }}</h2> | ||||||
|  |                     </ion-label> | ||||||
|                 </ion-item> |                 </ion-item> | ||||||
|                 <ion-item class="ion-text-wrap" *ngIf="badge.relatedbadges.length == 0"> |                 <ion-item class="ion-text-wrap" *ngIf="badge.relatedbadges.length == 0"> | ||||||
|                     <ion-label><h2>{{ 'addon.badges.norelated' | translate}}</h2></ion-label> |                     <ion-label> | ||||||
|  |                         <h2>{{ 'addon.badges.norelated' | translate}}</h2> | ||||||
|  |                     </ion-label> | ||||||
|                 </ion-item> |                 </ion-item> | ||||||
|             </ion-item-group> |             </ion-item-group> | ||||||
| 
 | 
 | ||||||
|             <!-- Competencies alignment --> |             <!-- Competencies alignment --> | ||||||
|             <ion-item-group *ngIf="badge.alignment"> |             <ion-item-group *ngIf="badge.alignment"> | ||||||
|                 <ion-item-divider> |                 <ion-item-divider> | ||||||
|                     <ion-label><h2>{{ 'addon.badges.alignment' | translate}}</h2></ion-label> |                     <ion-label> | ||||||
|  |                         <h2>{{ 'addon.badges.alignment' | translate}}</h2> | ||||||
|  |                     </ion-label> | ||||||
|                 </ion-item-divider> |                 </ion-item-divider> | ||||||
|                 <ion-item class="ion-text-wrap" *ngFor="let alignment of badge.alignment" [href]="alignment.targeturl" core-link |                 <ion-item class="ion-text-wrap" *ngFor="let alignment of badge.alignment" [href]="alignment.targeturl" core-link | ||||||
|                     auto-login="no"> |                     auto-login="no"> | ||||||
|                     <ion-label><h2>{{ alignment.targetname }}</h2></ion-label> |                     <ion-label> | ||||||
|  |                         <h2>{{ alignment.targetname }}</h2> | ||||||
|  |                     </ion-label> | ||||||
|                 </ion-item> |                 </ion-item> | ||||||
|                 <ion-item class="ion-text-wrap" *ngIf="badge.alignment.length == 0"> |                 <ion-item class="ion-text-wrap" *ngIf="badge.alignment.length == 0"> | ||||||
|                     <ion-label><h2>{{ 'addon.badges.noalignment' | translate}}</h2></ion-label> |                     <ion-label> | ||||||
|  |                         <h2>{{ 'addon.badges.noalignment' | translate}}</h2> | ||||||
|  |                     </ion-label> | ||||||
|                 </ion-item> |                 </ion-item> | ||||||
|             </ion-item-group> |             </ion-item-group> | ||||||
|         </ng-container> |         </ng-container> | ||||||
|  | |||||||
| @ -3,7 +3,9 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1>{{ 'addon.badges.badges' | translate }}</h1> |             <h1>{{ 'addon.badges.badges' | translate }}</h1> | ||||||
|  |         </ion-title> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content> | ||||||
| @ -12,8 +14,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]="badges.loaded"> |         <core-loading [hideUntil]="badges.loaded"> | ||||||
|             <core-empty-box *ngIf="badges.empty" icon="fas-trophy" |             <core-empty-box *ngIf="badges.empty" icon="fas-trophy" [message]="'addon.badges.nobadges' | translate"> | ||||||
|                 [message]="'addon.badges.nobadges' | translate"> |  | ||||||
|             </core-empty-box> |             </core-empty-box> | ||||||
| 
 | 
 | ||||||
|             <ion-list *ngIf="!badges.empty" class="ion-no-margin"> |             <ion-list *ngIf="!badges.empty" class="ion-no-margin"> | ||||||
|  | |||||||
| @ -3,7 +3,9 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1>{{ title | translate }}</h1> |             <h1>{{ title | translate }}</h1> | ||||||
|  |         </ion-title> | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <core-user-menu-button></core-user-menu-button> |             <core-user-menu-button></core-user-menu-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
| @ -18,8 +20,7 @@ | |||||||
|             <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> | ||||||
|         </ion-item> |         </ion-item> | ||||||
|         <core-empty-box *ngIf="entries && entries.length == 0" icon="far-newspaper" |         <core-empty-box *ngIf="entries && entries.length == 0" icon="far-newspaper" [message]="'addon.blog.noentriesyet' | translate"> | ||||||
|             [message]="'addon.blog.noentriesyet' | translate"> |  | ||||||
|         </core-empty-box> |         </core-empty-box> | ||||||
|         <ng-container *ngFor="let entry of entries"> |         <ng-container *ngFor="let entry of entries"> | ||||||
|             <ion-card *ngIf="!onlyMyEntries || entry.userid == currentUserId"> |             <ion-card *ngIf="!onlyMyEntries || entry.userid == currentUserId"> | ||||||
| @ -27,8 +28,7 @@ | |||||||
|                     <core-user-avatar [user]="entry.user" slot="start" [courseId]="entry.courseid"></core-user-avatar> |                     <core-user-avatar [user]="entry.user" slot="start" [courseId]="entry.courseid"></core-user-avatar> | ||||||
|                     <ion-label> |                     <ion-label> | ||||||
|                         <p class="item-heading"> |                         <p class="item-heading"> | ||||||
|                             <core-format-text [text]="entry.subject" [contextLevel]="contextLevel" |                             <core-format-text [text]="entry.subject" [contextLevel]="contextLevel" [contextInstanceId]="contextInstanceId"> | ||||||
|                                 [contextInstanceId]="contextInstanceId"> |  | ||||||
|                             </core-format-text> |                             </core-format-text> | ||||||
|                             <ion-note class="ion-float-end ion-padding-start ion-text-end"> |                             <ion-note class="ion-float-end ion-padding-start ion-text-end"> | ||||||
|                                 {{ 'addon.blog.' + entry.publishTranslated! | translate}} |                                 {{ 'addon.blog.' + entry.publishTranslated! | translate}} | ||||||
| @ -68,8 +68,8 @@ | |||||||
|                 </ion-card-content> |                 </ion-card-content> | ||||||
|                 <div class="ion-text-center ion-margin-bottom" *ngIf="entry.lastmodified > entry.created"> |                 <div class="ion-text-center ion-margin-bottom" *ngIf="entry.lastmodified > entry.created"> | ||||||
|                     <ion-note> |                     <ion-note> | ||||||
|                         <ion-icon name="fas-clock" |                         <ion-icon name="fas-clock" [attr.aria-label]="'core.lastmodified' | translate"></ion-icon> {{entry.lastmodified | | ||||||
|                             [attr.aria-label]="'core.lastmodified' | translate"></ion-icon> {{entry.lastmodified | coreTimeAgo}} |                         coreTimeAgo}} | ||||||
|                     </ion-note> |                     </ion-note> | ||||||
|                 </div> |                 </div> | ||||||
|             </ion-card> |             </ion-card> | ||||||
|  | |||||||
| @ -1,6 +1,8 @@ | |||||||
| <ion-header> | <ion-header> | ||||||
|     <ion-toolbar> |     <ion-toolbar> | ||||||
|  |         <ion-title> | ||||||
|             <h2>{{ 'addon.calendar.reminders' | translate }}</h2> |             <h2>{{ 'addon.calendar.reminders' | translate }}</h2> | ||||||
|  |         </ion-title> | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate"> |             <ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate"> | ||||||
|                 <ion-icon slot="icon-only" name="fas-times" aria-hidden="true"></ion-icon> |                 <ion-icon slot="icon-only" name="fas-times" aria-hidden="true"></ion-icon> | ||||||
| @ -36,15 +38,13 @@ | |||||||
| 
 | 
 | ||||||
|             <div class="flex-row"> |             <div class="flex-row"> | ||||||
|                 <!-- Input to enter the value. --> |                 <!-- Input to enter the value. --> | ||||||
|                 <ion-input type="number" name="customvalue" [(ngModel)]="customValue" [disabled]="radioValue != 'custom'" |                 <ion-input type="number" name="customvalue" [(ngModel)]="customValue" [disabled]="radioValue != 'custom'" placeholder="10"> | ||||||
|                     placeholder="10"> |  | ||||||
|                 </ion-input> |                 </ion-input> | ||||||
| 
 | 
 | ||||||
|                 <!-- Units. --> |                 <!-- Units. --> | ||||||
|                 <label class="accesshide" for="reminderUnits">{{ 'addon.calendar.units' | translate }}</label> |                 <label class="accesshide" for="reminderUnits">{{ 'addon.calendar.units' | translate }}</label> | ||||||
|                 <ion-select id="reminderUnits" name="customunits" [(ngModel)]="customUnits" interface="action-sheet" |                 <ion-select id="reminderUnits" name="customunits" [(ngModel)]="customUnits" interface="action-sheet" | ||||||
|                     [disabled]="radioValue != 'custom'" slot="end" |                     [disabled]="radioValue != 'custom'" slot="end" [interfaceOptions]="{header: 'addon.calendar.units' | translate}"> | ||||||
|                     [interfaceOptions]="{header: 'addon.calendar.units' | translate}"> |  | ||||||
|                     <ion-select-option *ngFor="let option of customUnitsOptions" [value]="option.value"> |                     <ion-select-option *ngFor="let option of customUnitsOptions" [value]="option.value"> | ||||||
|                         {{ option.label | translate }} |                         {{ option.label | translate }} | ||||||
|                     </ion-select-option> |                     </ion-select-option> | ||||||
|  | |||||||
| @ -3,7 +3,9 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1>{{ 'addon.calendar.calendarevents' | translate }}</h1> |             <h1>{{ 'addon.calendar.calendarevents' | translate }}</h1> | ||||||
|  |         </ion-title> | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <ion-button fill="clear" (click)="openFilter($event)" [attr.aria-label]="'core.filter' | translate"> |             <ion-button fill="clear" (click)="openFilter($event)" [attr.aria-label]="'core.filter' | translate"> | ||||||
|                 <ion-icon slot="icon-only" name="fas-filter" aria-hidden="true"></ion-icon> |                 <ion-icon slot="icon-only" name="fas-filter" aria-hidden="true"></ion-icon> | ||||||
| @ -13,8 +15,8 @@ | |||||||
|                     iconAction="fas-calendar-day" (action)="goToCurrentDay()"> |                     iconAction="fas-calendar-day" (action)="goToCurrentDay()"> | ||||||
|                 </core-context-menu-item> |                 </core-context-menu-item> | ||||||
|                 <core-context-menu-item [hidden]="!loaded || !hasOffline || !isOnline" [priority]="400" |                 <core-context-menu-item [hidden]="!loaded || !hasOffline || !isOnline" [priority]="400" | ||||||
|                     [content]="'core.settings.synchronizenow' | translate" (action)="doRefresh(undefined, $event)" |                     [content]="'core.settings.synchronizenow' | translate" (action)="doRefresh(undefined, $event)" [iconAction]="syncIcon" | ||||||
|                     [iconAction]="syncIcon" [closeOnClick]="false"> |                     [closeOnClick]="false"> | ||||||
|                 </core-context-menu-item> |                 </core-context-menu-item> | ||||||
|             </core-context-menu> |             </core-context-menu> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  | |||||||
| @ -3,7 +3,9 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1>{{ title | translate }}</h1> |             <h1>{{ title | translate }}</h1> | ||||||
|  |         </ion-title> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content> | ||||||
| @ -40,12 +42,8 @@ | |||||||
|                     <p class="item-heading" [core-mark-required]="true">{{ 'addon.calendar.eventkind' | translate }}</p> |                     <p class="item-heading" [core-mark-required]="true">{{ 'addon.calendar.eventkind' | translate }}</p> | ||||||
|                 </ion-label> |                 </ion-label> | ||||||
|                 <p *ngIf="eventTypes.length == 1" slot="end">{{eventTypes[0].name | translate }}</p> |                 <p *ngIf="eventTypes.length == 1" slot="end">{{eventTypes[0].name | translate }}</p> | ||||||
|                 <ion-select |                 <ion-select *ngIf="eventTypes.length > 1" formControlName="eventtype" interface="action-sheet" | ||||||
|                     *ngIf="eventTypes.length > 1" |                     [interfaceOptions]="{header: 'addon.calendar.eventkind' | translate}"> | ||||||
|                     formControlName="eventtype" |  | ||||||
|                     interface="action-sheet" |  | ||||||
|                     [interfaceOptions]="{header: 'addon.calendar.eventkind' | translate}" |  | ||||||
|                 > |  | ||||||
|                     <ion-select-option *ngFor="let type of eventTypes" [value]="type.value"> |                     <ion-select-option *ngFor="let type of eventTypes" [value]="type.value"> | ||||||
|                         {{ type.name | translate }} |                         {{ type.name | translate }} | ||||||
|                     </ion-select-option> |                     </ion-select-option> | ||||||
| @ -83,8 +81,7 @@ | |||||||
|                     <ion-label> |                     <ion-label> | ||||||
|                         <p class="item-heading" [core-mark-required]="true">{{ 'core.course' | translate }}</p> |                         <p class="item-heading" [core-mark-required]="true">{{ 'core.course' | translate }}</p> | ||||||
|                     </ion-label> |                     </ion-label> | ||||||
|                     <ion-select formControlName="groupcourseid" |                     <ion-select formControlName="groupcourseid" interface="action-sheet" [placeholder]="'core.noselection' | translate" | ||||||
|                         interface="action-sheet" [placeholder]="'core.noselection' | translate" |  | ||||||
|                         (ionChange)="groupCourseSelected()" [interfaceOptions]="{header: 'core.course' | translate}"> |                         (ionChange)="groupCourseSelected()" [interfaceOptions]="{header: 'core.course' | translate}"> | ||||||
|                         <ion-select-option *ngFor="let course of courses" [value]="course.id"> |                         <ion-select-option *ngFor="let course of courses" [value]="course.id"> | ||||||
|                             {{ course.fullname }} |                             {{ course.fullname }} | ||||||
| @ -93,7 +90,9 @@ | |||||||
|                 </ion-item> |                 </ion-item> | ||||||
|                 <!-- The course has no groups. --> |                 <!-- The course has no groups. --> | ||||||
|                 <ion-item class="ion-text-wrap core-danger-item" *ngIf="!loadingGroups && courseGroupSet && !groups.length"> |                 <ion-item class="ion-text-wrap core-danger-item" *ngIf="!loadingGroups && courseGroupSet && !groups.length"> | ||||||
|                     <ion-label><p>{{ 'core.coursenogroups' | translate }}</p></ion-label> |                     <ion-label> | ||||||
|  |                         <p>{{ 'core.coursenogroups' | translate }}</p> | ||||||
|  |                     </ion-label> | ||||||
|                 </ion-item> |                 </ion-item> | ||||||
|                 <!-- Select the group. --> |                 <!-- Select the group. --> | ||||||
|                 <ion-item class="ion-text-wrap" *ngIf="!loadingGroups && groups.length > 0"> |                 <ion-item class="ion-text-wrap" *ngIf="!loadingGroups && groups.length > 0"> | ||||||
| @ -128,8 +127,7 @@ | |||||||
|                     <ion-label> |                     <ion-label> | ||||||
|                         <p>{{ reminder.label }}</p> |                         <p>{{ reminder.label }}</p> | ||||||
|                     </ion-label> |                     </ion-label> | ||||||
|                     <ion-button fill="clear" (click)="removeReminder(reminder)" [attr.aria-label]="'core.delete' | translate" |                     <ion-button fill="clear" (click)="removeReminder(reminder)" [attr.aria-label]="'core.delete' | translate" slot="end"> | ||||||
|                         slot="end"> |  | ||||||
|                         <ion-icon name="fas-trash" color="danger" slot="icon-only" aria-hidden="true"></ion-icon> |                         <ion-icon name="fas-trash" color="danger" slot="icon-only" aria-hidden="true"></ion-icon> | ||||||
|                     </ion-button> |                     </ion-button> | ||||||
|                 </ion-item> |                 </ion-item> | ||||||
| @ -158,8 +156,7 @@ | |||||||
|                     <ion-item *ngIf="form.controls.duration.value === 1"> |                     <ion-item *ngIf="form.controls.duration.value === 1"> | ||||||
|                         <ion-label position="stacked"></ion-label> |                         <ion-label position="stacked"></ion-label> | ||||||
|                         <ion-datetime formControlName="timedurationuntil" [max]="maxDate" [min]="minDate" |                         <ion-datetime formControlName="timedurationuntil" [max]="maxDate" [min]="minDate" | ||||||
|                             [placeholder]="'addon.calendar.durationuntil' | translate" |                             [placeholder]="'addon.calendar.durationuntil' | translate" [displayFormat]="dateFormat" display-timezone="utc"> | ||||||
|                             [displayFormat]="dateFormat" display-timezone="utc"> |  | ||||||
|                         </ion-datetime> |                         </ion-datetime> | ||||||
|                     </ion-item> |                     </ion-item> | ||||||
|                     <ion-item lines="none"> |                     <ion-item lines="none"> | ||||||
| @ -171,8 +168,7 @@ | |||||||
|                     <ion-item *ngIf="form.controls.duration.value === 2"> |                     <ion-item *ngIf="form.controls.duration.value === 2"> | ||||||
|                         <ion-label class="sr-only">{{ 'addon.calendar.durationminutes' | translate }}</ion-label> |                         <ion-label class="sr-only">{{ 'addon.calendar.durationminutes' | translate }}</ion-label> | ||||||
|                         <ion-input type="number" name="timedurationminutes" slot="end" |                         <ion-input type="number" name="timedurationminutes" slot="end" | ||||||
|                             [placeholder]="'addon.calendar.durationminutes' | translate" |                             [placeholder]="'addon.calendar.durationminutes' | translate" formControlName="timedurationminutes"></ion-input> | ||||||
|                             formControlName="timedurationminutes"></ion-input> |  | ||||||
|                     </ion-item> |                     </ion-item> | ||||||
|                 </ion-radio-group> |                 </ion-radio-group> | ||||||
|             </div> |             </div> | ||||||
| @ -223,8 +219,8 @@ | |||||||
|                     <p class="item-heading">{{ 'core.description' | translate }}</p> |                     <p class="item-heading">{{ 'core.description' | translate }}</p> | ||||||
|                 </ion-label> |                 </ion-label> | ||||||
|                 <core-rich-text-editor [control]="descriptionControl" [attr.aria-label]="'core.description' | translate" |                 <core-rich-text-editor [control]="descriptionControl" [attr.aria-label]="'core.description' | translate" | ||||||
|                     [placeholder]="'core.description' | translate" name="description" [component]="component" |                     [placeholder]="'core.description' | translate" name="description" [component]="component" [componentId]="eventId" | ||||||
|                     [componentId]="eventId" [autoSave]="false"></core-rich-text-editor> |                     [autoSave]="false"></core-rich-text-editor> | ||||||
|             </ion-item> |             </ion-item> | ||||||
| 
 | 
 | ||||||
|             <!-- Location. --> |             <!-- Location. --> | ||||||
|  | |||||||
| @ -3,30 +3,31 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1 *ngIf="event"> |             <h1 *ngIf="event"> | ||||||
|             <core-mod-icon *ngIf="event.moduleIcon" [modicon]="event.moduleIcon" [showAlt]="false" |                 <core-mod-icon *ngIf="event.moduleIcon" [modicon]="event.moduleIcon" [showAlt]="false" [modname]="event.modulename" | ||||||
|                 [modname]="event.modulename" [componentId]="event.instance"></core-mod-icon> |                     [componentId]="event.instance"></core-mod-icon> | ||||||
|                 <ion-icon *ngIf="event.eventIcon && !event.moduleIcon" [name]="event.eventIcon" aria-hidden="true"></ion-icon> |                 <ion-icon *ngIf="event.eventIcon && !event.moduleIcon" [name]="event.eventIcon" aria-hidden="true"></ion-icon> | ||||||
|                 <!-- Add the icon title so accessibility tools read it. --> |                 <!-- Add the icon title so accessibility tools read it. --> | ||||||
|                 <span class="sr-only"> |                 <span class="sr-only"> | ||||||
|                     {{ 'addon.calendar.type' + event.formattedType | translate }} |                     {{ 'addon.calendar.type' + event.formattedType | translate }} | ||||||
|                     <span class="sr-only" *ngIf="event.moduleIcon && event.iconTitle">{{ event.iconTitle }}</span> |                     <span class="sr-only" *ngIf="event.moduleIcon && event.iconTitle">{{ event.iconTitle }}</span> | ||||||
|                 </span> |                 </span> | ||||||
|             <core-format-text [text]="event.name" [contextLevel]="event.contextLevel" |                 <core-format-text [text]="event.name" [contextLevel]="event.contextLevel" [contextInstanceId]="event.contextInstanceId"> | ||||||
|                 [contextInstanceId]="event.contextInstanceId"></core-format-text> |                 </core-format-text> | ||||||
|             </h1> |             </h1> | ||||||
|  |         </ion-title> | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <core-context-menu> |             <core-context-menu> | ||||||
|                 <core-context-menu-item [hidden]="!eventLoaded || (!hasOffline && event && !event.deleted) || !isOnline" |                 <core-context-menu-item [hidden]="!eventLoaded || (!hasOffline && event && !event.deleted) || !isOnline" [priority]="400" | ||||||
|                     [priority]="400" [content]="'core.settings.synchronizenow' | translate" (action)="doRefresh(undefined, $event, true)" |                     [content]="'core.settings.synchronizenow' | translate" (action)="doRefresh(undefined, $event, true)" | ||||||
|                     [iconAction]="syncIcon" [closeOnClick]="false"> |                     [iconAction]="syncIcon" [closeOnClick]="false"> | ||||||
|                 </core-context-menu-item> |                 </core-context-menu-item> | ||||||
|                 <core-context-menu-item [hidden]="!event || !event.canedit || event.deleted || (!canEdit && event.id > 0)" |                 <core-context-menu-item [hidden]="!event || !event.canedit || event.deleted || (!canEdit && event.id > 0)" [priority]="300" | ||||||
|                     [priority]="300" [content]="'core.edit' | translate" (action)="openEdit()" iconAction="fas-edit"> |                     [content]="'core.edit' | translate" (action)="openEdit()" iconAction="fas-edit"> | ||||||
|                 </core-context-menu-item> |                 </core-context-menu-item> | ||||||
|                 <core-context-menu-item [hidden]="!event || !event.candelete || event.deleted" [priority]="200" |                 <core-context-menu-item [hidden]="!event || !event.candelete || event.deleted" [priority]="200" | ||||||
|                     [content]="'core.delete' | translate" (action)="deleteEvent()" |                     [content]="'core.delete' | translate" (action)="deleteEvent()" iconAction="fas-trash"></core-context-menu-item> | ||||||
|                     iconAction="fas-trash"></core-context-menu-item> |  | ||||||
|                 <core-context-menu-item [hidden]="!event || !event.deleted" [priority]="200" [content]="'core.restore' | translate" |                 <core-context-menu-item [hidden]="!event || !event.deleted" [priority]="200" [content]="'core.restore' | translate" | ||||||
|                     (action)="undoDelete()" iconAction="fas-undo-alt"></core-context-menu-item> |                     (action)="undoDelete()" iconAction="fas-undo-alt"></core-context-menu-item> | ||||||
|             </core-context-menu> |             </core-context-menu> | ||||||
| @ -82,8 +83,10 @@ | |||||||
|                 <ion-item class="ion-text-wrap" *ngIf="categoryPath"> |                 <ion-item class="ion-text-wrap" *ngIf="categoryPath"> | ||||||
|                     <ion-label> |                     <ion-label> | ||||||
|                         <h2>{{ 'core.category' | translate}}</h2> |                         <h2>{{ 'core.category' | translate}}</h2> | ||||||
|                         <p><core-format-text [text]="categoryPath" contextLevel="coursecat" |                         <p> | ||||||
|                             [contextInstanceId]="event.categoryid"></core-format-text></p> |                             <core-format-text [text]="categoryPath" contextLevel="coursecat" [contextInstanceId]="event.categoryid"> | ||||||
|  |                             </core-format-text> | ||||||
|  |                         </p> | ||||||
|                     </ion-label> |                     </ion-label> | ||||||
|                 </ion-item> |                 </ion-item> | ||||||
|                 <ion-item class="ion-text-wrap" *ngIf="event.description"> |                 <ion-item class="ion-text-wrap" *ngIf="event.description"> | ||||||
| @ -123,13 +126,12 @@ | |||||||
|                 </ion-label> |                 </ion-label> | ||||||
|             </ion-item> |             </ion-item> | ||||||
|             <ng-container *ngFor="let reminder of reminders"> |             <ng-container *ngFor="let reminder of reminders"> | ||||||
|                 <ion-item *ngIf="reminder.timestamp > 0" class="ion-text-wrap" |                 <ion-item *ngIf="reminder.timestamp > 0" class="ion-text-wrap" [class.item-dimmed]="reminder.timestamp <= currentTime"> | ||||||
|                     [class.item-dimmed]="reminder.timestamp <= currentTime"> |  | ||||||
|                     <ion-label> |                     <ion-label> | ||||||
|                         <p>{{ reminder.label }}</p> |                         <p>{{ reminder.label }}</p> | ||||||
|                     </ion-label> |                     </ion-label> | ||||||
|                     <ion-button fill="clear" (click)="cancelNotification(reminder.id, $event)" |                     <ion-button fill="clear" (click)="cancelNotification(reminder.id, $event)" [attr.aria-label]="'core.delete' | translate" | ||||||
|                         [attr.aria-label]="'core.delete' | translate" slot="end" *ngIf="reminder.timestamp > currentTime"> |                         slot="end" *ngIf="reminder.timestamp > currentTime"> | ||||||
|                         <ion-icon name="fas-trash" color="danger" slot="icon-only" aria-hidden="true"></ion-icon> |                         <ion-icon name="fas-trash" color="danger" slot="icon-only" aria-hidden="true"></ion-icon> | ||||||
|                     </ion-button> |                     </ion-button> | ||||||
|                 </ion-item> |                 </ion-item> | ||||||
|  | |||||||
| @ -3,20 +3,20 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1>{{ (showCalendar ? 'addon.calendar.calendarevents' : 'addon.calendar.upcomingevents') | translate }}</h1> |             <h1>{{ (showCalendar ? 'addon.calendar.calendarevents' : 'addon.calendar.upcomingevents') | translate }}</h1> | ||||||
|  |         </ion-title> | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <ion-button fill="clear" (click)="openFilter($event)" [attr.aria-label]="'core.filter' | translate"> |             <ion-button fill="clear" (click)="openFilter($event)" [attr.aria-label]="'core.filter' | translate"> | ||||||
|                 <ion-icon slot="icon-only" name="fas-filter" aria-hidden="true"></ion-icon> |                 <ion-icon slot="icon-only" name="fas-filter" aria-hidden="true"></ion-icon> | ||||||
|             </ion-button> |             </ion-button> | ||||||
|             <core-context-menu> |             <core-context-menu> | ||||||
|                 <core-context-menu-item *ngIf="showCalendar" [priority]="800" |                 <core-context-menu-item *ngIf="showCalendar" [priority]="800" [content]="'addon.calendar.upcomingevents' | translate" | ||||||
|                 [content]="'addon.calendar.upcomingevents' | translate" iconAction="fas-th-list" |                     iconAction="fas-th-list" (action)="toggleDisplay()"></core-context-menu-item> | ||||||
|                 (action)="toggleDisplay()"></core-context-menu-item> |                 <core-context-menu-item *ngIf="!showCalendar" [priority]="800" [content]="'addon.calendar.monthlyview' | translate" | ||||||
|                 <core-context-menu-item *ngIf="!showCalendar" [priority]="800" |                     iconAction="fas-calendar-alt" (action)="toggleDisplay()"></core-context-menu-item> | ||||||
|                 [content]="'addon.calendar.monthlyview' | translate" iconAction="fas-calendar-alt" |                 <core-context-menu-item [hidden]="!notificationsEnabled" [priority]="600" [content]="'core.settings.settings' | translate" | ||||||
|                 (action)="toggleDisplay()"></core-context-menu-item> |                     (action)="openSettings()" iconAction="fas-cogs"> | ||||||
|                 <core-context-menu-item [hidden]="!notificationsEnabled" [priority]="600" |  | ||||||
|                 [content]="'core.settings.settings' | translate" (action)="openSettings()" iconAction="fas-cogs"> |  | ||||||
|                 </core-context-menu-item> |                 </core-context-menu-item> | ||||||
|                 <core-context-menu-item [hidden]="!loaded || !hasOffline || !isOnline" [priority]="400" |                 <core-context-menu-item [hidden]="!loaded || !hasOffline || !isOnline" [priority]="400" | ||||||
|                     [content]="'core.settings.synchronizenow' | translate" (action)="doRefresh(undefined, $event, true)" |                     [content]="'core.settings.synchronizenow' | translate" (action)="doRefresh(undefined, $event, true)" | ||||||
| @ -43,8 +43,7 @@ | |||||||
|         [displayNavButtons]="showCalendar" (onEventClicked)="gotoEvent($event)" (onDayClicked)="gotoDay($event)"> |         [displayNavButtons]="showCalendar" (onEventClicked)="gotoEvent($event)" (onDayClicked)="gotoDay($event)"> | ||||||
|     </addon-calendar-calendar> |     </addon-calendar-calendar> | ||||||
| 
 | 
 | ||||||
|     <addon-calendar-upcoming-events *ngIf="loadUpcoming" [hidden]="showCalendar" [filter]="filter" |     <addon-calendar-upcoming-events *ngIf="loadUpcoming" [hidden]="showCalendar" [filter]="filter" (onEventClicked)="gotoEvent($event)"> | ||||||
|         (onEventClicked)="gotoEvent($event)"> |  | ||||||
|     </addon-calendar-upcoming-events> |     </addon-calendar-upcoming-events> | ||||||
| 
 | 
 | ||||||
|     <!-- Create a calendar event. --> |     <!-- Create a calendar event. --> | ||||||
|  | |||||||
| @ -3,7 +3,9 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1>{{ 'core.settings.settings' | translate }}</h1> |             <h1>{{ 'core.settings.settings' | translate }}</h1> | ||||||
|  |         </ion-title> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content> | ||||||
|  | |||||||
| @ -3,7 +3,9 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1>{{ title }}</h1> |             <h1>{{ title }}</h1> | ||||||
|  |         </ion-title> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content> | ||||||
|  | |||||||
| @ -3,9 +3,11 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1 *ngIf="competency"> |             <h1 *ngIf="competency"> | ||||||
|                 {{ competency.competency.competency.shortname }} <small>{{ competency.competency.competency.idnumber }}</small> |                 {{ competency.competency.competency.shortname }} <small>{{ competency.competency.competency.idnumber }}</small> | ||||||
|             </h1> |             </h1> | ||||||
|  |         </ion-title> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content> | ||||||
| @ -16,7 +18,9 @@ | |||||||
|         <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> | ||||||
|                 <ion-label><h2>{{ user.fullname }}</h2></ion-label> |                 <ion-label> | ||||||
|  |                     <h2>{{ user.fullname }}</h2> | ||||||
|  |                 </ion-label> | ||||||
|             </ion-item> |             </ion-item> | ||||||
|         </ion-card> |         </ion-card> | ||||||
| 
 | 
 | ||||||
| @ -32,11 +36,9 @@ | |||||||
|                 <ion-label> |                 <ion-label> | ||||||
|                     <p class="item-heading">{{ 'addon.competency.path' | translate }}</p> |                     <p class="item-heading">{{ 'addon.competency.path' | translate }}</p> | ||||||
|                     <p> |                     <p> | ||||||
|                         <a *ngIf="competency.competency.comppath.showlinks" |                         <a *ngIf="competency.competency.comppath.showlinks" [href]="competency.competency.comppath.pluginbaseurl + '/competencies.php?competencyframeworkid=' + | ||||||
|                             [href]="competency.competency.comppath.pluginbaseurl + '/competencies.php?competencyframeworkid=' + |  | ||||||
|                             competency.competency.comppath.framework.id + '&pagecontextid=' + |                             competency.competency.comppath.framework.id + '&pagecontextid=' + | ||||||
|                             competency.competency.comppath.pagecontextid" |                             competency.competency.comppath.pagecontextid" core-link> | ||||||
|                             core-link> |  | ||||||
|                             {{ competency.competency.comppath.framework.name }} |                             {{ competency.competency.comppath.framework.name }} | ||||||
|                         </a> |                         </a> | ||||||
|                         <ng-container *ngIf="!competency.competency.comppath.showlinks"> |                         <ng-container *ngIf="!competency.competency.comppath.showlinks"> | ||||||
| @ -129,7 +131,9 @@ | |||||||
|                 </ion-item> |                 </ion-item> | ||||||
|                 <ion-item class="ion-text-wrap"> |                 <ion-item class="ion-text-wrap"> | ||||||
|                     <ion-label> |                     <ion-label> | ||||||
|                         <p><ion-badge color="dark">{{ evidence.gradename }}</ion-badge></p> |                         <p> | ||||||
|  |                             <ion-badge color="dark">{{ evidence.gradename }}</ion-badge> | ||||||
|  |                         </p> | ||||||
|                         <p class="ion-margin-top" *ngIf="evidence.description">{{ evidence.description }}</p> |                         <p class="ion-margin-top" *ngIf="evidence.description">{{ evidence.description }}</p> | ||||||
|                         <blockquote *ngIf="evidence.note">{{ evidence.note }}</blockquote> |                         <blockquote *ngIf="evidence.note">{{ evidence.note }}</blockquote> | ||||||
|                     </ion-label> |                     </ion-label> | ||||||
|  | |||||||
| @ -3,9 +3,11 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1 *ngIf="competency"> |             <h1 *ngIf="competency"> | ||||||
|                 {{ competency.competency.shortname }} <small>{{ competency.competency.idnumber }}</small> |                 {{ competency.competency.shortname }} <small>{{ competency.competency.idnumber }}</small> | ||||||
|             </h1> |             </h1> | ||||||
|  |         </ion-title> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content> | ||||||
|  | |||||||
| @ -3,7 +3,9 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1>{{ 'addon.competency.coursecompetencies' | translate }}</h1> |             <h1>{{ 'addon.competency.coursecompetencies' | translate }}</h1> | ||||||
|  |         </ion-title> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content> | ||||||
| @ -50,11 +52,13 @@ | |||||||
|         <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> | ||||||
|                <ion-label><h2>{{ user.fullname }}</h2></ion-label> |                 <ion-label> | ||||||
|  |                     <h2>{{ user.fullname }}</h2> | ||||||
|  |                 </ion-label> | ||||||
|             </ion-item> |             </ion-item> | ||||||
|         </ion-card> |         </ion-card> | ||||||
|         <core-empty-box *ngIf="competencies && competencies.statistics.competencycount == 0" |         <core-empty-box *ngIf="competencies && competencies.statistics.competencycount == 0" icon="fas-award" | ||||||
|             icon="fas-award" message="{{ 'addon.competency.nocompetenciesincourse' | translate }}"> |             message="{{ 'addon.competency.nocompetenciesincourse' | translate }}"> | ||||||
|         </core-empty-box> |         </core-empty-box> | ||||||
| 
 | 
 | ||||||
|         <div *ngIf="competencies"> |         <div *ngIf="competencies"> | ||||||
| @ -81,10 +85,9 @@ | |||||||
|                         <div> |                         <div> | ||||||
|                             <p class="item-heading">{{ 'addon.competency.path' | translate }}</p> |                             <p class="item-heading">{{ 'addon.competency.path' | translate }}</p> | ||||||
|                             <p> |                             <p> | ||||||
|                                 <a *ngIf="competency.comppath.showlinks" |                                 <a *ngIf="competency.comppath.showlinks" [href]="competency.comppath.pluginbaseurl + '/competencies.php?competencyframeworkid=' + | ||||||
|                                     [href]="competency.comppath.pluginbaseurl + '/competencies.php?competencyframeworkid=' + |                                     competency.comppath.framework.id + '&pagecontextid=' + competency.comppath.pagecontextid" core-link | ||||||
|                                     competency.comppath.framework.id + '&pagecontextid=' + competency.comppath.pagecontextid" |                                     [title]="competency.comppath.framework.name"> | ||||||
|                                     core-link [title]="competency.comppath.framework.name"> |  | ||||||
|                                     {{ competency.comppath.framework.name }} |                                     {{ competency.comppath.framework.name }} | ||||||
|                                 </a> |                                 </a> | ||||||
|                                 <ng-container *ngIf="!competency.comppath.showlinks"> |                                 <ng-container *ngIf="!competency.comppath.showlinks"> | ||||||
|  | |||||||
| @ -3,7 +3,9 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1 *ngIf="plan">{{plan.plan.name}}</h1> |             <h1 *ngIf="plan">{{plan.plan.name}}</h1> | ||||||
|  |         </ion-title> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content> | ||||||
| @ -24,8 +26,7 @@ | |||||||
|                 <ion-item class="ion-text-wrap" *ngIf="plan.plan.description" lines="none"> |                 <ion-item class="ion-text-wrap" *ngIf="plan.plan.description" lines="none"> | ||||||
|                     <ion-label> |                     <ion-label> | ||||||
|                         <p> |                         <p> | ||||||
|                             <core-format-text [text]="plan.plan.description" contextLevel="user" |                             <core-format-text [text]="plan.plan.description" contextLevel="user" [contextInstanceId]="plan.plan.userid"> | ||||||
|                                 [contextInstanceId]="plan.plan.userid"> |  | ||||||
|                             </core-format-text> |                             </core-format-text> | ||||||
|                         </p> |                         </p> | ||||||
|                     </ion-label> |                     </ion-label> | ||||||
| @ -74,8 +75,8 @@ | |||||||
|                     </ion-label> |                     </ion-label> | ||||||
|                 </ion-item> |                 </ion-item> | ||||||
|                 <ion-item class="ion-text-wrap" *ngFor="let competency of plan.competencies" |                 <ion-item class="ion-text-wrap" *ngFor="let competency of plan.competencies" | ||||||
|                     (click)="openCompetency(competency.competency.id)" |                     (click)="openCompetency(competency.competency.id)" [attr.aria-label]="competency.competency.shortname" detail="true" | ||||||
|                     [attr.aria-label]="competency.competency.shortname" detail="true" button> |                     button> | ||||||
|                     <ion-label> |                     <ion-label> | ||||||
|                         <p class="item-heading">{{competency.competency.shortname}} <em>{{competency.competency.idnumber}}</em></p> |                         <p class="item-heading">{{competency.competency.shortname}} <em>{{competency.competency.idnumber}}</em></p> | ||||||
|                     </ion-label> |                     </ion-label> | ||||||
|  | |||||||
| @ -3,7 +3,9 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1>{{ 'addon.competency.userplans' | translate }}</h1> |             <h1>{{ 'addon.competency.userplans' | translate }}</h1> | ||||||
|  |         </ion-title> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content> | ||||||
| @ -16,8 +18,8 @@ | |||||||
| 
 | 
 | ||||||
|             </core-empty-box> |             </core-empty-box> | ||||||
|             <ion-list *ngIf="!plans.empty" class="ion-no-margin"> |             <ion-list *ngIf="!plans.empty" class="ion-no-margin"> | ||||||
|                 <ion-item class="ion-text-wrap" *ngFor="let plan of plans.items" [attr.aria-label]="plan.name" |                 <ion-item class="ion-text-wrap" *ngFor="let plan of plans.items" [attr.aria-label]="plan.name" (click)="plans.select(plan)" | ||||||
|                     (click)="plans.select(plan)" [attr.aria-current]="plans.getItemAriaCurrent(plan)" button detail="true"> |                     [attr.aria-current]="plans.getItemAriaCurrent(plan)" button detail="true"> | ||||||
|                     <ion-label> |                     <ion-label> | ||||||
|                         <p class="item-heading">{{ plan.name }}</p> |                         <p class="item-heading">{{ plan.name }}</p> | ||||||
|                         <p *ngIf="plan.duedate > 0"> |                         <p *ngIf="plan.duedate > 0"> | ||||||
| @ -30,4 +32,4 @@ | |||||||
|             </ion-list> |             </ion-list> | ||||||
|         </core-loading> |         </core-loading> | ||||||
|     </core-split-view> |     </core-split-view> | ||||||
|     </ion-content> | </ion-content> | ||||||
|  | |||||||
| @ -3,7 +3,9 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1>{{ 'addon.coursecompletion.coursecompletion' | translate }}</h1> |             <h1>{{ 'addon.coursecompletion.coursecompletion' | translate }}</h1> | ||||||
|  |         </ion-title> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content> | ||||||
| @ -28,14 +30,18 @@ | |||||||
|         </ion-card> |         </ion-card> | ||||||
|         <ion-card *ngIf="completion && tracked"> |         <ion-card *ngIf="completion && tracked"> | ||||||
|             <ion-item-divider> |             <ion-item-divider> | ||||||
|                 <ion-label><h2>{{ 'addon.coursecompletion.requiredcriteria' | translate }}</h2></ion-label> |                 <ion-label> | ||||||
|  |                     <h2>{{ 'addon.coursecompletion.requiredcriteria' | translate }}</h2> | ||||||
|  |                 </ion-label> | ||||||
|             </ion-item-divider> |             </ion-item-divider> | ||||||
|             <ion-item class="ion-hide-md-up ion-text-wrap" *ngFor="let criteria of completion.completions"> |             <ion-item class="ion-hide-md-up ion-text-wrap" *ngFor="let criteria of completion.completions"> | ||||||
|                 <ion-label> |                 <ion-label> | ||||||
|                     <p class="item-heading"> |                     <p class="item-heading"> | ||||||
|                         <core-format-text clean="true" [text]="criteria.details.criteria" [filter]="false"></core-format-text> |                         <core-format-text clean="true" [text]="criteria.details.criteria" [filter]="false"></core-format-text> | ||||||
|                     </p> |                     </p> | ||||||
|                     <p><core-format-text clean="true" [text]="criteria.details.requirement" [filter]="false"></core-format-text></p> |                     <p> | ||||||
|  |                         <core-format-text clean="true" [text]="criteria.details.requirement" [filter]="false"></core-format-text> | ||||||
|  |                     </p> | ||||||
|                 </ion-label> |                 </ion-label> | ||||||
|                 <strong slot="end">{{ criteria.status }}</strong> |                 <strong slot="end">{{ criteria.status }}</strong> | ||||||
|             </ion-item> |             </ion-item> | ||||||
| @ -73,7 +79,9 @@ | |||||||
|         </ion-card> |         </ion-card> | ||||||
|         <ion-card *ngIf="showSelfComplete && tracked"> |         <ion-card *ngIf="showSelfComplete && tracked"> | ||||||
|             <ion-item-divider> |             <ion-item-divider> | ||||||
|                 <ion-label><h2>{{ 'addon.coursecompletion.manualselfcompletion' | translate }}</h2></ion-label> |                 <ion-label> | ||||||
|  |                     <h2>{{ 'addon.coursecompletion.manualselfcompletion' | translate }}</h2> | ||||||
|  |                 </ion-label> | ||||||
|             </ion-item-divider> |             </ion-item-divider> | ||||||
|             <ion-item> |             <ion-item> | ||||||
|                 <ion-label> |                 <ion-label> | ||||||
|  | |||||||
| @ -3,7 +3,9 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1>{{ 'addon.messageoutput_airnotifier.processorsettingsdesc' | translate }}</h1> |             <h1>{{ 'addon.messageoutput_airnotifier.processorsettingsdesc' | translate }}</h1> | ||||||
|  |         </ion-title> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content> | ||||||
| @ -21,10 +23,7 @@ | |||||||
|                     <p>{{ device.platform }} {{ device.version }}</p> |                     <p>{{ device.platform }} {{ device.version }}</p> | ||||||
|                 </ion-label> |                 </ion-label> | ||||||
|                 <core-button-with-spinner [loading]="device.updating" slot="end"> |                 <core-button-with-spinner [loading]="device.updating" slot="end"> | ||||||
|                     <ion-toggle |                     <ion-toggle [(ngModel)]="device.enable" (ngModelChange)="enableDevice(device, device.enable)"> | ||||||
|                         [(ngModel)]="device.enable" |  | ||||||
|                         (ngModelChange)="enableDevice(device, device.enable)" |  | ||||||
|                     > |  | ||||||
|                     </ion-toggle> |                     </ion-toggle> | ||||||
|                 </core-button-with-spinner> |                 </core-button-with-spinner> | ||||||
|             </ion-item> |             </ion-item> | ||||||
|  | |||||||
| @ -1,6 +1,8 @@ | |||||||
| <ion-header> | <ion-header> | ||||||
|     <ion-toolbar> |     <ion-toolbar> | ||||||
|  |         <ion-title> | ||||||
|             <h2>{{ 'addon.messages.groupinfo' | translate }}</h2> |             <h2>{{ 'addon.messages.groupinfo' | translate }}</h2> | ||||||
|  |         </ion-title> | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate"> |             <ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate"> | ||||||
|                 <ion-icon name="fas-times" slot="icon-only" aria-hidden="true"></ion-icon> |                 <ion-icon name="fas-times" slot="icon-only" aria-hidden="true"></ion-icon> | ||||||
| @ -32,8 +34,8 @@ | |||||||
|             </ion-label> |             </ion-label> | ||||||
|         </ion-item> |         </ion-item> | ||||||
| 
 | 
 | ||||||
|         <ion-item class="ion-text-wrap addon-messages-conversation-item" *ngFor="let member of members" |         <ion-item class="ion-text-wrap addon-messages-conversation-item" *ngFor="let member of members" (click)="closeModal(member.id)" | ||||||
|             (click)="closeModal(member.id)" detail="true" button> |             detail="true" button> | ||||||
|             <core-user-avatar [user]="member" [linkProfile]="false" [checkOnline]="member.showonlinestatus" slot="start"> |             <core-user-avatar [user]="member" [linkProfile]="false" [checkOnline]="member.showonlinestatus" slot="start"> | ||||||
|             </core-user-avatar> |             </core-user-avatar> | ||||||
|             <ion-label> |             <ion-label> | ||||||
|  | |||||||
| @ -3,7 +3,9 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1>{{ 'addon.messages.contacts' | translate }}</h1> |             <h1>{{ 'addon.messages.contacts' | translate }}</h1> | ||||||
|  |         </ion-title> | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| @ -14,9 +16,8 @@ | |||||||
|             <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-search-box (onSubmit)="search($event)" (onClear)="clearSearch()" |         <core-search-box (onSubmit)="search($event)" (onClear)="clearSearch()" [placeholder]="'addon.messages.contactname' | translate" | ||||||
|             [placeholder]="'addon.messages.contactname' | translate" autocorrect="off" spellcheck="false" lengthCheck="2" |             autocorrect="off" spellcheck="false" lengthCheck="2" [disabled]="!loaded" searchArea="AddonMessagesContacts"></core-search-box> | ||||||
|             [disabled]="!loaded" searchArea="AddonMessagesContacts"></core-search-box> |  | ||||||
| 
 | 
 | ||||||
|         <core-loading [hideUntil]="loaded" [message]="loadingMessage"> |         <core-loading [hideUntil]="loaded" [message]="loadingMessage"> | ||||||
|             <core-empty-box *ngIf="!hasContacts && searchString == ''" icon="fas-address-book" |             <core-empty-box *ngIf="!hasContacts && searchString == ''" icon="fas-address-book" | ||||||
| @ -28,17 +29,23 @@ | |||||||
|             <ion-list *ngFor="let contactType of contactTypes" class="ion-no-margin"> |             <ion-list *ngFor="let contactType of contactTypes" class="ion-no-margin"> | ||||||
|                 <ng-container *ngIf="contacts[contactType] && (contacts[contactType].length > 0 || contactType === searchType)"> |                 <ng-container *ngIf="contacts[contactType] && (contacts[contactType].length > 0 || contactType === searchType)"> | ||||||
|                     <ion-item-divider> |                     <ion-item-divider> | ||||||
|                         <ion-label><p class="item-heading">{{ 'addon.messages.type_' + contactType | translate }}</p></ion-label> |                         <ion-label> | ||||||
|                         <ion-note slot="end" class="ion-padding-end"><ion-badge>{{ contacts[contactType].length }}</ion-badge></ion-note> |                             <p class="item-heading">{{ 'addon.messages.type_' + contactType | translate }}</p> | ||||||
|  |                         </ion-label> | ||||||
|  |                         <ion-note slot="end" class="ion-padding-end"> | ||||||
|  |                             <ion-badge>{{ contacts[contactType].length }}</ion-badge> | ||||||
|  |                         </ion-note> | ||||||
|                     </ion-item-divider> |                     </ion-item-divider> | ||||||
|                     <ng-container *ngFor="let contact of contacts[contactType]"> |                     <ng-container *ngFor="let contact of contacts[contactType]"> | ||||||
|                         <!-- Don't show deleted users --> |                         <!-- Don't show deleted users --> | ||||||
|                         <ion-item class="ion-text-wrap addon-messages-conversation-item" |                         <ion-item class="ion-text-wrap addon-messages-conversation-item" | ||||||
|                             *ngIf="contact.profileimageurl || contact.profileimageurlsmall" |                             *ngIf="contact.profileimageurl || contact.profileimageurlsmall" [attr.aria-label]="contact.fullname" | ||||||
|                             [attr.aria-label]="contact.fullname" (click)="gotoDiscussion(contact.id)" detail="true" button |                             (click)="gotoDiscussion(contact.id)" detail="true" button | ||||||
|                             [attr.aria-current]="contact.id == discussionUserId ? 'page' : 'false'"> |                             [attr.aria-current]="contact.id == discussionUserId ? 'page' : 'false'"> | ||||||
|                             <core-user-avatar [user]="contact" slot="start" [checkOnline]="contact.showonlinestatus"></core-user-avatar> |                             <core-user-avatar [user]="contact" slot="start" [checkOnline]="contact.showonlinestatus"></core-user-avatar> | ||||||
|                             <ion-label><p class="item-heading">{{ contact.fullname }}</p></ion-label> |                             <ion-label> | ||||||
|  |                                 <p class="item-heading">{{ contact.fullname }}</p> | ||||||
|  |                             </ion-label> | ||||||
|                         </ion-item> |                         </ion-item> | ||||||
|                     </ng-container> |                     </ng-container> | ||||||
|                 </ng-container> |                 </ng-container> | ||||||
|  | |||||||
| @ -3,7 +3,9 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1>{{ 'addon.messages.contacts' | translate }}</h1> |             <h1>{{ 'addon.messages.contacts' | translate }}</h1> | ||||||
|  |         </ion-title> | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <ion-button fill="clear" (click)="gotoSearch()" [attr.aria-label]="'addon.messages.searchcombined' | translate"> |             <ion-button fill="clear" (click)="gotoSearch()" [attr.aria-label]="'addon.messages.searchcombined' | translate"> | ||||||
|                 <ion-icon name="fas-search" slot="icon-only" aria-hidden="true"></ion-icon> |                 <ion-icon name="fas-search" slot="icon-only" aria-hidden="true"></ion-icon> | ||||||
| @ -26,8 +28,8 @@ | |||||||
|                             <ion-item class="ion-text-wrap addon-messages-conversation-item" (click)="selectUser(contact.id)" button |                             <ion-item class="ion-text-wrap addon-messages-conversation-item" (click)="selectUser(contact.id)" button | ||||||
|                                 *ngFor="let contact of confirmedContacts" [attr.aria-label]="contact.fullname" detail="true" |                                 *ngFor="let contact of confirmedContacts" [attr.aria-label]="contact.fullname" detail="true" | ||||||
|                                 [attr.aria-current]="contact.id == selectedUserId ? 'page' : 'false'"> |                                 [attr.aria-current]="contact.id == selectedUserId ? 'page' : 'false'"> | ||||||
|                                 <core-user-avatar slot="start" [user]="contact" |                                 <core-user-avatar slot="start" [user]="contact" [checkOnline]="contact.showonlinestatus" | ||||||
|                                     [checkOnline]="contact.showonlinestatus" [linkProfile]="false"> |                                     [linkProfile]="false"> | ||||||
|                                 </core-user-avatar> |                                 </core-user-avatar> | ||||||
|                                 <ion-label> |                                 <ion-label> | ||||||
|                                     <p class="item-heading"> |                                     <p class="item-heading"> | ||||||
| @ -45,8 +47,8 @@ | |||||||
|                             [message]="'addon.messages.nocontactsgetstarted' | translate"> |                             [message]="'addon.messages.nocontactsgetstarted' | translate"> | ||||||
|                         </core-empty-box> |                         </core-empty-box> | ||||||
| 
 | 
 | ||||||
|                         <core-infinite-loading [enabled]="confirmedCanLoadMore" (action)="loadMore($event)" |                         <core-infinite-loading [enabled]="confirmedCanLoadMore" (action)="loadMore($event)" [error]="confirmedLoadMoreError" | ||||||
|                             [error]="confirmedLoadMoreError" position="bottom"> |                             position="bottom"> | ||||||
|                         </core-infinite-loading> |                         </core-infinite-loading> | ||||||
|                     </core-loading> |                     </core-loading> | ||||||
|                 </ng-template> |                 </ng-template> | ||||||
| @ -77,8 +79,8 @@ | |||||||
|                         <core-empty-box *ngIf="!requests.length" icon="far-address-book" |                         <core-empty-box *ngIf="!requests.length" icon="far-address-book" | ||||||
|                             [message]="'addon.messages.nocontactrequests' | translate"> |                             [message]="'addon.messages.nocontactrequests' | translate"> | ||||||
|                         </core-empty-box> |                         </core-empty-box> | ||||||
|                         <core-infinite-loading [enabled]="requestsCanLoadMore" (action)="loadMore($event)" |                         <core-infinite-loading [enabled]="requestsCanLoadMore" (action)="loadMore($event)" [error]="requestsLoadMoreError" | ||||||
|                             [error]="requestsLoadMoreError" position="bottom"> |                             position="bottom"> | ||||||
|                         </core-infinite-loading> |                         </core-infinite-loading> | ||||||
|                     </core-loading> |                     </core-loading> | ||||||
|                 </ng-template> |                 </ng-template> | ||||||
|  | |||||||
| @ -3,12 +3,12 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1> |             <h1> | ||||||
|             <img *ngIf="loaded && !otherMember && conversationImage" class="core-bar-button-image" [src]="conversationImage" |                 <img *ngIf="loaded && !otherMember && conversationImage" class="core-bar-button-image" [src]="conversationImage" alt="" | ||||||
|                 alt="" onError="this.src='assets/img/group-avatar.png'" core-external-content role="presentation" |                     onError="this.src='assets/img/group-avatar.png'" core-external-content role="presentation" [siteId]="siteId || null"> | ||||||
|                 [siteId]="siteId || null"> |                 <core-user-avatar *ngIf="loaded && otherMember" class="core-bar-button-image" [user]="otherMember" [linkProfile]="false" | ||||||
|             <core-user-avatar *ngIf="loaded && otherMember" class="core-bar-button-image" [user]="otherMember" |                     [checkOnline]="otherMember.showonlinestatus"> | ||||||
|                 [linkProfile]="false" [checkOnline]="otherMember.showonlinestatus"> |  | ||||||
|                 </core-user-avatar> |                 </core-user-avatar> | ||||||
|                 <core-format-text [text]="title" contextLevel="system" [contextInstanceId]="0"></core-format-text> |                 <core-format-text [text]="title" contextLevel="system" [contextInstanceId]="0"></core-format-text> | ||||||
|                 <ion-icon *ngIf="conversation && conversation.isfavourite" name="fas-star" |                 <ion-icon *ngIf="conversation && conversation.isfavourite" name="fas-star" | ||||||
| @ -18,44 +18,41 @@ | |||||||
|                     [attr.aria-label]="'addon.messages.mutedconversation' | translate"> |                     [attr.aria-label]="'addon.messages.mutedconversation' | translate"> | ||||||
|                 </ion-icon> |                 </ion-icon> | ||||||
|             </h1> |             </h1> | ||||||
|  |         </ion-title> | ||||||
|         <ion-buttons slot="end"></ion-buttons> |         <ion-buttons slot="end"></ion-buttons> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
|     <core-navbar-buttons slot="end"> |     <core-navbar-buttons slot="end"> | ||||||
|         <core-context-menu [attr.aria-label]="'addon.messages.conversationactions' | translate"> |         <core-context-menu [attr.aria-label]="'addon.messages.conversationactions' | translate"> | ||||||
|             <core-context-menu-item [hidden]="isSelf || !showInfo || isGroup" [priority]="1000" |             <core-context-menu-item [hidden]="isSelf || !showInfo || isGroup" [priority]="1000" | ||||||
|                 [content]="'addon.messages.info' | translate" (action)="viewInfo()" |                 [content]="'addon.messages.info' | translate" (action)="viewInfo()" iconAction="fas-info-circle"></core-context-menu-item> | ||||||
|                 iconAction="fas-info-circle"></core-context-menu-item> |  | ||||||
|             <core-context-menu-item [hidden]="isSelf || !showInfo || !isGroup" [priority]="1000" |             <core-context-menu-item [hidden]="isSelf || !showInfo || !isGroup" [priority]="1000" | ||||||
|                 [content]="'addon.messages.groupinfo' | translate" (action)="viewInfo()" |                 [content]="'addon.messages.groupinfo' | translate" (action)="viewInfo()" iconAction="fas-info-circle"> | ||||||
|                 iconAction="fas-info-circle"></core-context-menu-item> |             </core-context-menu-item> | ||||||
|             <core-context-menu-item [hidden]="!groupMessagingEnabled || !conversation" [priority]="800" |             <core-context-menu-item [hidden]="!groupMessagingEnabled || !conversation" [priority]="800" [content]="(conversation && conversation.isfavourite ? 'addon.messages.removefromfavourites' : | ||||||
|                 [content]="(conversation && conversation.isfavourite ? 'addon.messages.removefromfavourites' : |                 'addon.messages.addtofavourites') | translate" (action)="changeFavourite($event)" [closeOnClick]="false" | ||||||
|                 'addon.messages.addtofavourites') | translate" |                 [iconAction]="favouriteIcon" [iconSlash]="favouriteIconSlash"></core-context-menu-item> | ||||||
|                 (action)="changeFavourite($event)" [closeOnClick]="false" [iconAction]="favouriteIcon" |  | ||||||
|                 [iconSlash]="favouriteIconSlash"></core-context-menu-item> |  | ||||||
|             <core-context-menu-item [hidden]="isSelf || !otherMember || otherMember.isblocked" [priority]="700" |             <core-context-menu-item [hidden]="isSelf || !otherMember || otherMember.isblocked" [priority]="700" | ||||||
|                 [content]="'addon.messages.blockuser' | translate" (action)="blockUser()" [iconAction]="blockIcon"> |                 [content]="'addon.messages.blockuser' | translate" (action)="blockUser()" [iconAction]="blockIcon"> | ||||||
|             </core-context-menu-item> |             </core-context-menu-item> | ||||||
|             <core-context-menu-item [hidden]="isSelf || !otherMember || !otherMember.isblocked" [priority]="700" |             <core-context-menu-item [hidden]="isSelf || !otherMember || !otherMember.isblocked" [priority]="700" | ||||||
|                 [content]="'addon.messages.unblockuser' | translate" (action)="unblockUser()" [iconAction]="blockIcon"> |                 [content]="'addon.messages.unblockuser' | translate" (action)="unblockUser()" [iconAction]="blockIcon"> | ||||||
|             </core-context-menu-item> |             </core-context-menu-item> | ||||||
|             <core-context-menu-item [hidden]="isSelf || !muteEnabled || !conversation" [priority]="600" |             <core-context-menu-item [hidden]="isSelf || !muteEnabled || !conversation" [priority]="600" [content]="(conversation && conversation.ismuted ? 'addon.messages.unmuteconversation' : | ||||||
|                 [content]="(conversation && conversation.ismuted ? 'addon.messages.unmuteconversation' : |  | ||||||
|                 'addon.messages.muteconversation') | translate" (action)="changeMute($event)" [closeOnClick]="false" |                 'addon.messages.muteconversation') | translate" (action)="changeMute($event)" [closeOnClick]="false" | ||||||
|                 [iconAction]="muteIcon"></core-context-menu-item> |                 [iconAction]="muteIcon"></core-context-menu-item> | ||||||
|             <core-context-menu-item [hidden]="!canDelete || !messages || !messages.length" [priority]="400" |             <core-context-menu-item [hidden]="!canDelete || !messages || !messages.length" [priority]="400" | ||||||
|                 [content]="'addon.messages.showdeletemessages' | translate" |                 [content]="'addon.messages.showdeletemessages' | translate" iconAction="toggle" [(toggle)]="showDelete"> | ||||||
|                 iconAction="toggle" [(toggle)]="showDelete"></core-context-menu-item> |             </core-context-menu-item> | ||||||
|             <core-context-menu-item [hidden]="!groupMessagingEnabled || !conversationId || isGroup || !messages || !messages.length" |             <core-context-menu-item [hidden]="!groupMessagingEnabled || !conversationId || isGroup || !messages || !messages.length" | ||||||
|                 [priority]="200" [content]="'addon.messages.deleteconversation' | translate" (action)="deleteConversation($event)" |                 [priority]="200" [content]="'addon.messages.deleteconversation' | translate" (action)="deleteConversation($event)" | ||||||
|                 [closeOnClick]="false" [iconAction]="deleteIcon"></core-context-menu-item> |                 [closeOnClick]="false" [iconAction]="deleteIcon"></core-context-menu-item> | ||||||
|             <core-context-menu-item |             <core-context-menu-item | ||||||
|                 [hidden]="isSelf || !otherMember || otherMember.iscontact || requestContactSent || requestContactReceived" |                 [hidden]="isSelf || !otherMember || otherMember.iscontact || requestContactSent || requestContactReceived" [priority]="100" | ||||||
|                 [priority]="100" [content]="'addon.messages.addtoyourcontacts' | translate" (action)="createContactRequest()" |                 [content]="'addon.messages.addtoyourcontacts' | translate" (action)="createContactRequest()" [iconAction]="addRemoveIcon"> | ||||||
|                 [iconAction]="addRemoveIcon"></core-context-menu-item> |             </core-context-menu-item> | ||||||
|             <core-context-menu-item [hidden]="isSelf || !otherMember || !otherMember.iscontact" [priority]="100" |             <core-context-menu-item [hidden]="isSelf || !otherMember || !otherMember.iscontact" [priority]="100" | ||||||
|                 [content]="'addon.messages.removefromyourcontacts' | translate" (action)="removeContact()" |                 [content]="'addon.messages.removefromyourcontacts' | translate" (action)="removeContact()" [iconAction]="addRemoveIcon" | ||||||
|                 [iconAction]="addRemoveIcon" [iconSlash]="true"></core-context-menu-item> |                 [iconSlash]="true"></core-context-menu-item> | ||||||
|         </core-context-menu> |         </core-context-menu> | ||||||
|     </core-navbar-buttons> |     </core-navbar-buttons> | ||||||
| </ion-header> | </ion-header> | ||||||
| @ -72,15 +69,13 @@ | |||||||
| 
 | 
 | ||||||
|         <h2 class="sr-only">{{ title }}</h2> |         <h2 class="sr-only">{{ title }}</h2> | ||||||
| 
 | 
 | ||||||
|         <ion-list class="addon-messages-discussion-container" [class.addon-messages-discussion-group]="isGroup" |         <ion-list class="addon-messages-discussion-container" [class.addon-messages-discussion-group]="isGroup" [attr.aria-live]="'polite'"> | ||||||
|             [attr.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"> | ||||||
|                 <h3 class="ion-text-center addon-messages-date" *ngIf="message.showDate"> |                 <h3 class="ion-text-center addon-messages-date" *ngIf="message.showDate"> | ||||||
|                     {{ message.timecreated | coreFormatDate: "strftimedayshort" }} |                     {{ message.timecreated | coreFormatDate: "strftimedayshort" }} | ||||||
|                 </h3> |                 </h3> | ||||||
| 
 | 
 | ||||||
|                 <ion-chip class="addon-messages-unreadfrom" *ngIf="unreadMessageFrom && message.id == unreadMessageFrom" |                 <ion-chip class="addon-messages-unreadfrom" *ngIf="unreadMessageFrom && message.id == unreadMessageFrom" color="light"> | ||||||
|                     color="light"> |  | ||||||
|                     <ion-label>{{ 'addon.messages.newmessages' | translate }}</ion-label> |                     <ion-label>{{ 'addon.messages.newmessages' | translate }}</ion-label> | ||||||
|                     <ion-icon name="fas-arrow-down" aria-hidden="true"></ion-icon> |                     <ion-icon name="fas-arrow-down" aria-hidden="true"></ion-icon> | ||||||
|                 </ion-chip> |                 </ion-chip> | ||||||
| @ -93,8 +88,7 @@ | |||||||
|                     <ion-label> |                     <ion-label> | ||||||
|                         <!-- User data. --> |                         <!-- User data. --> | ||||||
|                         <div *ngIf="message.showUserData" class="item-heading addon-message-user"> |                         <div *ngIf="message.showUserData" class="item-heading addon-message-user"> | ||||||
|                             <core-user-avatar slot="start" [user]="members[message.useridfrom]" [linkProfile]="false" |                             <core-user-avatar slot="start" [user]="members[message.useridfrom]" [linkProfile]="false" aria-hidden="true"> | ||||||
|                                 aria-hidden="true"> |  | ||||||
|                             </core-user-avatar> |                             </core-user-avatar> | ||||||
|                             <div>{{ members[message.useridfrom].fullname }}</div> |                             <div>{{ members[message.useridfrom].fullname }}</div> | ||||||
|                         </div> |                         </div> | ||||||
|  | |||||||
| @ -3,7 +3,9 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1>{{ 'addon.messages.messages' | translate }}</h1> |             <h1>{{ 'addon.messages.messages' | translate }}</h1> | ||||||
|  |         </ion-title> | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <core-user-menu-button></core-user-menu-button> |             <core-user-menu-button></core-user-menu-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
| @ -15,9 +17,9 @@ | |||||||
|             <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-search-box (onSubmit)="searchMessage($event)" (onClear)="clearSearch()" |         <core-search-box (onSubmit)="searchMessage($event)" (onClear)="clearSearch()" [placeholder]=" 'addon.messages.message' | translate" | ||||||
|             [placeholder]=" 'addon.messages.message' | translate" autocorrect="off" spellcheck="false" lengthCheck="2" |             autocorrect="off" spellcheck="false" lengthCheck="2" [disabled]="!loaded" searchArea="AddonMessagesDiscussions" | ||||||
|             [disabled]="!loaded" searchArea="AddonMessagesDiscussions" [autoFocus]="false"></core-search-box> |             [autoFocus]="false"></core-search-box> | ||||||
| 
 | 
 | ||||||
|         <core-loading [hideUntil]="loaded" [message]="loadingMessage"> |         <core-loading [hideUntil]="loaded" [message]="loadingMessage"> | ||||||
| 
 | 
 | ||||||
| @ -26,7 +28,9 @@ | |||||||
|                 <ion-item class="ion-text-wrap addon-message-discussion" (click)="gotoContacts()" |                 <ion-item class="ion-text-wrap addon-message-discussion" (click)="gotoContacts()" | ||||||
|                     [attr.aria-label]="'addon.messages.contacts' | translate" detail="true" button> |                     [attr.aria-label]="'addon.messages.contacts' | translate" detail="true" button> | ||||||
|                     <ion-icon name="fas-address-book" slot="start" aria-hidden="true"></ion-icon> |                     <ion-icon name="fas-address-book" slot="start" aria-hidden="true"></ion-icon> | ||||||
|                     <ion-label><h2>{{ 'addon.messages.contacts' | translate }}</h2></ion-label> |                     <ion-label> | ||||||
|  |                         <h2>{{ 'addon.messages.contacts' | translate }}</h2> | ||||||
|  |                     </ion-label> | ||||||
|                 </ion-item> |                 </ion-item> | ||||||
| 
 | 
 | ||||||
|                 <ng-container *ngIf="search.showResults"> |                 <ng-container *ngIf="search.showResults"> | ||||||
| @ -34,7 +38,9 @@ | |||||||
|                         <ion-label> |                         <ion-label> | ||||||
|                             <h2>{{ 'core.searchresults' | translate }}</h2> |                             <h2>{{ 'core.searchresults' | translate }}</h2> | ||||||
|                         </ion-label> |                         </ion-label> | ||||||
|                         <ion-note slot="end" class="ion-padding-end"><ion-badge>{{ search.results.length }}</ion-badge></ion-note> |                         <ion-note slot="end" class="ion-padding-end"> | ||||||
|  |                             <ion-badge>{{ search.results.length }}</ion-badge> | ||||||
|  |                         </ion-note> | ||||||
|                     </ion-item-divider> |                     </ion-item-divider> | ||||||
|                     <ion-item class="ion-text-wrap addon-message-discussion" *ngFor="let result of search.results" button |                     <ion-item class="ion-text-wrap addon-message-discussion" *ngFor="let result of search.results" button | ||||||
|                         [attr.aria-label]="result.fullname" (click)="gotoDiscussion(result.userid, result.messageid)" |                         [attr.aria-label]="result.fullname" (click)="gotoDiscussion(result.userid, result.messageid)" | ||||||
| @ -42,8 +48,10 @@ | |||||||
|                         <core-user-avatar [user]="result" slot="start" [checkOnline]="result.showonlinestatus"></core-user-avatar> |                         <core-user-avatar [user]="result" slot="start" [checkOnline]="result.showonlinestatus"></core-user-avatar> | ||||||
|                         <ion-label> |                         <ion-label> | ||||||
|                             <p class="item-heading">{{ result.fullname }}</p> |                             <p class="item-heading">{{ result.fullname }}</p> | ||||||
|                             <p><core-format-text clean="true" singleLine="true" [text]="result.lastmessage" contextLevel="system" |                             <p> | ||||||
|                                 [contextInstanceId]="0"></core-format-text></p> |                                 <core-format-text clean="true" singleLine="true" [text]="result.lastmessage" contextLevel="system" | ||||||
|  |                                     [contextInstanceId]="0"></core-format-text> | ||||||
|  |                             </p> | ||||||
|                         </ion-label> |                         </ion-label> | ||||||
|                     </ion-item> |                     </ion-item> | ||||||
|                 </ng-container> |                 </ng-container> | ||||||
| @ -67,8 +75,8 @@ | |||||||
|                                 </ion-note> |                                 </ion-note> | ||||||
|                             </div> |                             </div> | ||||||
|                             <p> |                             <p> | ||||||
|                                 <core-format-text clean="true" singleLine="true" [text]="discussion.message!.message" |                                 <core-format-text clean="true" singleLine="true" [text]="discussion.message!.message" contextLevel="system" | ||||||
|                                     contextLevel="system" [contextInstanceId]="0"> |                                     [contextInstanceId]="0"> | ||||||
|                                 </core-format-text> |                                 </core-format-text> | ||||||
|                             </p> |                             </p> | ||||||
|                         </ion-label> |                         </ion-label> | ||||||
|  | |||||||
| @ -3,7 +3,9 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1>{{ 'addon.messages.messages' | translate }}</h1> |             <h1>{{ 'addon.messages.messages' | translate }}</h1> | ||||||
|  |         </ion-title> | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <ion-button fill="clear" (click)="gotoSearch()" [attr.aria-label]="'addon.messages.searchcombined' | translate"> |             <ion-button fill="clear" (click)="gotoSearch()" [attr.aria-label]="'addon.messages.searchcombined' | translate"> | ||||||
|                 <ion-icon name="fas-search" slot="icon-only" aria-hidden="true"></ion-icon> |                 <ion-icon name="fas-search" slot="icon-only" aria-hidden="true"></ion-icon> | ||||||
| @ -25,28 +27,25 @@ | |||||||
|             <ion-list> |             <ion-list> | ||||||
|                 <ion-item class="ion-text-wrap addon-message-discussion" (click)="gotoContacts()" detail="true" button> |                 <ion-item class="ion-text-wrap addon-message-discussion" (click)="gotoContacts()" detail="true" button> | ||||||
|                     <ion-icon name="fas-address-book" slot="start" aria-hidden="true"></ion-icon> |                     <ion-icon name="fas-address-book" slot="start" aria-hidden="true"></ion-icon> | ||||||
|                     <ion-label><h2>{{ 'addon.messages.contacts' | translate }}</h2></ion-label> |                     <ion-label> | ||||||
|  |                         <h2>{{ 'addon.messages.contacts' | translate }}</h2> | ||||||
|  |                     </ion-label> | ||||||
|                     <ion-badge *ngIf="contactRequestsCount > 0" slot="end" aria-hidden="true">{{contactRequestsCount}}</ion-badge> |                     <ion-badge *ngIf="contactRequestsCount > 0" slot="end" aria-hidden="true">{{contactRequestsCount}}</ion-badge> | ||||||
|                     <span *ngIf="contactRequestsCount > 0" class="sr-only"> |                     <span *ngIf="contactRequestsCount > 0" class="sr-only"> | ||||||
|                         {{ 'addon.messages.pendingcontactrequests' | translate:{$a: contactRequestsCount} }} |                         {{ 'addon.messages.pendingcontactrequests' | translate:{$a: contactRequestsCount} }} | ||||||
|                     </span> |                     </span> | ||||||
|                 </ion-item> |                 </ion-item> | ||||||
|                 <!-- Favourite conversations. --> |                 <!-- Favourite conversations. --> | ||||||
|                 <ion-item |                 <ion-item button class="ion-text-wrap divider" (click)="toggle(favourites)" sticky="true" | ||||||
|                     button |  | ||||||
|                     class="ion-text-wrap divider" |  | ||||||
|                     (click)="toggle(favourites)" |  | ||||||
|                     sticky="true" |  | ||||||
|                     [attr.aria-label]="(favourites.expanded ? 'core.collapse' : 'core.expand') | translate" |                     [attr.aria-label]="(favourites.expanded ? 'core.collapse' : 'core.expand') | translate" | ||||||
|                     [attr.aria-expanded]="favourites.expanded" |                     [attr.aria-expanded]="favourites.expanded" aria-controls="addon-messages-groupconversations-favourite" role="heading" | ||||||
|                     aria-controls="addon-messages-groupconversations-favourite" |                     detail="false"> | ||||||
|                     role="heading" |  | ||||||
|                     detail="false" |  | ||||||
|                 > |  | ||||||
|                     <ion-icon *ngIf="!favourites.expanded" name="fas-caret-right" flip-rtl slot="start" aria-hidden="true"> |                     <ion-icon *ngIf="!favourites.expanded" name="fas-caret-right" flip-rtl slot="start" aria-hidden="true"> | ||||||
|                     </ion-icon> |                     </ion-icon> | ||||||
|                     <ion-icon *ngIf="favourites.expanded" name="fas-caret-down" slot="start" aria-hidden="true"></ion-icon> |                     <ion-icon *ngIf="favourites.expanded" name="fas-caret-down" slot="start" aria-hidden="true"></ion-icon> | ||||||
|                     <ion-label><h2>{{ 'core.favourites' | translate }} ({{ favourites.count }})</h2></ion-label> |                     <ion-label> | ||||||
|  |                         <h2>{{ 'core.favourites' | translate }} ({{ favourites.count }})</h2> | ||||||
|  |                     </ion-label> | ||||||
|                     <ion-badge slot="end" *ngIf="favourites.unread" aria-hidden="true">{{ favourites.unread }}</ion-badge> |                     <ion-badge slot="end" *ngIf="favourites.unread" aria-hidden="true">{{ favourites.unread }}</ion-badge> | ||||||
|                     <span *ngIf="favourites.unread" class="sr-only"> |                     <span *ngIf="favourites.unread" class="sr-only"> | ||||||
|                         {{ 'addon.messages.unreadconversations' | translate:{$a: favourites.unread} }} |                         {{ 'addon.messages.unreadconversations' | translate:{$a: favourites.unread} }} | ||||||
| @ -60,28 +59,26 @@ | |||||||
|                     <core-infinite-loading [enabled]="favourites.canLoadMore" (action)="loadMoreConversations(favourites, $event)" |                     <core-infinite-loading [enabled]="favourites.canLoadMore" (action)="loadMoreConversations(favourites, $event)" | ||||||
|                         [error]="favourites.loadMoreError"></core-infinite-loading> |                         [error]="favourites.loadMoreError"></core-infinite-loading> | ||||||
|                     <ion-item class="ion-text-wrap" *ngIf="favourites.conversations && favourites.conversations.length == 0"> |                     <ion-item class="ion-text-wrap" *ngIf="favourites.conversations && favourites.conversations.length == 0"> | ||||||
|                         <ion-label><p>{{ 'addon.messages.nofavourites' | translate }}</p></ion-label> |                         <ion-label> | ||||||
|  |                             <p>{{ 'addon.messages.nofavourites' | translate }}</p> | ||||||
|  |                         </ion-label> | ||||||
|                     </ion-item> |                     </ion-item> | ||||||
|                 </div> |                 </div> | ||||||
|                 <ion-item class="ion-text-center" *ngIf="favourites.loading"> |                 <ion-item class="ion-text-center" *ngIf="favourites.loading"> | ||||||
|                     <ion-label><ion-spinner [attr.aria-label]="'core.loading' | translate"></ion-spinner></ion-label> |                     <ion-label> | ||||||
|  |                         <ion-spinner [attr.aria-label]="'core.loading' | translate"></ion-spinner> | ||||||
|  |                     </ion-label> | ||||||
|                 </ion-item> |                 </ion-item> | ||||||
| 
 | 
 | ||||||
|                 <!-- Group conversations. --> |                 <!-- Group conversations. --> | ||||||
|                 <ion-item |                 <ion-item button class="divider ion-text-wrap" (click)="toggle(group)" sticky="true" | ||||||
|                     button |                     [attr.aria-label]="(group.expanded ? 'core.collapse' : 'core.expand') | translate" [attr.aria-expanded]="group.expanded" | ||||||
|                     class="divider ion-text-wrap" |                     aria-controls="addon-messages-groupconversations-group" role="heading" detail="false"> | ||||||
|                     (click)="toggle(group)" |  | ||||||
|                     sticky="true" |  | ||||||
|                     [attr.aria-label]="(group.expanded ? 'core.collapse' : 'core.expand') | translate" |  | ||||||
|                     [attr.aria-expanded]="group.expanded" |  | ||||||
|                     aria-controls="addon-messages-groupconversations-group" |  | ||||||
|                     role="heading" |  | ||||||
|                     detail="false" |  | ||||||
|                 > |  | ||||||
|                     <ion-icon *ngIf="!group.expanded" name="fas-caret-right" flip-rtl slot="start" aria-hidden="true"></ion-icon> |                     <ion-icon *ngIf="!group.expanded" name="fas-caret-right" flip-rtl slot="start" aria-hidden="true"></ion-icon> | ||||||
|                     <ion-icon *ngIf="group.expanded" name="fas-caret-down" slot="start" aria-hidden="true"></ion-icon> |                     <ion-icon *ngIf="group.expanded" name="fas-caret-down" slot="start" aria-hidden="true"></ion-icon> | ||||||
|                     <ion-label><h2>{{ 'addon.messages.groupconversations' | translate }} ({{ group.count }})</h2></ion-label> |                     <ion-label> | ||||||
|  |                         <h2>{{ 'addon.messages.groupconversations' | translate }} ({{ group.count }})</h2> | ||||||
|  |                     </ion-label> | ||||||
|                     <ion-badge slot="end" *ngIf="group.unread" aria-hidden="true">{{ group.unread }}</ion-badge> |                     <ion-badge slot="end" *ngIf="group.unread" aria-hidden="true">{{ group.unread }}</ion-badge> | ||||||
|                     <span *ngIf="group.unread" class="sr-only"> |                     <span *ngIf="group.unread" class="sr-only"> | ||||||
|                         {{ 'addon.messages.unreadconversations' | translate:{$a: group.unread} }} |                         {{ 'addon.messages.unreadconversations' | translate:{$a: group.unread} }} | ||||||
| @ -95,24 +92,21 @@ | |||||||
|                     <core-infinite-loading [enabled]="group.canLoadMore" (action)="loadMoreConversations(group, $event)" |                     <core-infinite-loading [enabled]="group.canLoadMore" (action)="loadMoreConversations(group, $event)" | ||||||
|                         [error]="group.loadMoreError"></core-infinite-loading> |                         [error]="group.loadMoreError"></core-infinite-loading> | ||||||
|                     <ion-item class="ion-text-wrap" *ngIf="group.conversations && group.conversations.length == 0"> |                     <ion-item class="ion-text-wrap" *ngIf="group.conversations && group.conversations.length == 0"> | ||||||
|                         <ion-label><p>{{ 'addon.messages.nogroupconversations' | translate }}</p></ion-label> |                         <ion-label> | ||||||
|  |                             <p>{{ 'addon.messages.nogroupconversations' | translate }}</p> | ||||||
|  |                         </ion-label> | ||||||
|                     </ion-item> |                     </ion-item> | ||||||
|                 </div> |                 </div> | ||||||
|                 <ion-item class="ion-text-center" *ngIf="group.loading"> |                 <ion-item class="ion-text-center" *ngIf="group.loading"> | ||||||
|                     <ion-label><ion-spinner [attr.aria-label]="'core.loading' | translate"></ion-spinner></ion-label> |                     <ion-label> | ||||||
|  |                         <ion-spinner [attr.aria-label]="'core.loading' | translate"></ion-spinner> | ||||||
|  |                     </ion-label> | ||||||
|                 </ion-item> |                 </ion-item> | ||||||
| 
 | 
 | ||||||
|                 <ion-item |                 <ion-item button class="divider ion-text-wrap" (click)="toggle(individual)" sticky="true" | ||||||
|                     button |  | ||||||
|                     class="divider ion-text-wrap" |  | ||||||
|                     (click)="toggle(individual)" |  | ||||||
|                     sticky="true" |  | ||||||
|                     [attr.aria-label]="(individual.expanded ? 'core.collapse' : 'core.expand') | translate" |                     [attr.aria-label]="(individual.expanded ? 'core.collapse' : 'core.expand') | translate" | ||||||
|                     [attr.aria-expanded]="individual.expanded" |                     [attr.aria-expanded]="individual.expanded" aria-controls="addon-messages-groupconversations-individual" role="heading" | ||||||
|                     aria-controls="addon-messages-groupconversations-individual" |                     detail="false"> | ||||||
|                     role="heading" |  | ||||||
|                     detail="false" |  | ||||||
|                 > |  | ||||||
|                     <ion-icon *ngIf="!individual.expanded" name="fas-caret-right" flip-rtl slot="start" aria-hidden="true"> |                     <ion-icon *ngIf="!individual.expanded" name="fas-caret-right" flip-rtl slot="start" aria-hidden="true"> | ||||||
|                     </ion-icon> |                     </ion-icon> | ||||||
|                     <ion-icon *ngIf="individual.expanded" name="fas-caret-down" slot="start" aria-hidden="true"></ion-icon> |                     <ion-icon *ngIf="individual.expanded" name="fas-caret-down" slot="start" aria-hidden="true"></ion-icon> | ||||||
| @ -132,11 +126,15 @@ | |||||||
|                     <core-infinite-loading [enabled]="individual.canLoadMore" (action)="loadMoreConversations(individual, $event)" |                     <core-infinite-loading [enabled]="individual.canLoadMore" (action)="loadMoreConversations(individual, $event)" | ||||||
|                         [error]="individual.loadMoreError"></core-infinite-loading> |                         [error]="individual.loadMoreError"></core-infinite-loading> | ||||||
|                     <ion-item class="ion-text-wrap" *ngIf="individual.conversations && individual.conversations.length == 0"> |                     <ion-item class="ion-text-wrap" *ngIf="individual.conversations && individual.conversations.length == 0"> | ||||||
|                         <ion-label><p>{{ 'addon.messages.noindividualconversations' | translate }}</p></ion-label> |                         <ion-label> | ||||||
|  |                             <p>{{ 'addon.messages.noindividualconversations' | translate }}</p> | ||||||
|  |                         </ion-label> | ||||||
|                     </ion-item> |                     </ion-item> | ||||||
|                 </div> |                 </div> | ||||||
|                 <ion-item class="ion-text-center" *ngIf="individual.loading"> |                 <ion-item class="ion-text-center" *ngIf="individual.loading"> | ||||||
|                     <ion-label><ion-spinner [attr.aria-label]="'core.loading' | translate"></ion-spinner></ion-label> |                     <ion-label> | ||||||
|  |                         <ion-spinner [attr.aria-label]="'core.loading' | translate"></ion-spinner> | ||||||
|  |                     </ion-label> | ||||||
|                 </ion-item> |                 </ion-item> | ||||||
| 
 | 
 | ||||||
|             </ion-list> |             </ion-list> | ||||||
| @ -147,8 +145,7 @@ | |||||||
| <!-- Template to render a list of conversations. --> | <!-- Template to render a list of conversations. --> | ||||||
| <ng-template #conversationsTemplate let-conversations="conversations"> | <ng-template #conversationsTemplate let-conversations="conversations"> | ||||||
|     <ion-item class="ion-text-wrap addon-message-discussion" *ngFor="let conversation of conversations" button detail="false" |     <ion-item class="ion-text-wrap addon-message-discussion" *ngFor="let conversation of conversations" button detail="false" | ||||||
|         [attr.aria-label]="conversation.name" (click)="gotoConversation(conversation.id, conversation.userid)" |         [attr.aria-label]="conversation.name" (click)="gotoConversation(conversation.id, conversation.userid)" [attr.aria-current]="((conversation.id && conversation.id == selectedConversationId) || | ||||||
|         [attr.aria-current]="((conversation.id && conversation.id == selectedConversationId) || |  | ||||||
|             (conversation.userid && conversation.userid == selectedUserId)) ? 'page': 'false'" |             (conversation.userid && conversation.userid == selectedUserId)) ? 'page': 'false'" | ||||||
|         id="addon-message-conversation-{{ conversation.id ? conversation.id : 'user-' + conversation.userid }}"> |         id="addon-message-conversation-{{ conversation.id ? conversation.id : 'user-' + conversation.userid }}"> | ||||||
|         <!-- Group conversation image. --> |         <!-- Group conversation image. --> | ||||||
| @ -158,17 +155,17 @@ | |||||||
|         </ion-avatar> |         </ion-avatar> | ||||||
| 
 | 
 | ||||||
|         <!-- Avatar for individual conversations. --> |         <!-- Avatar for individual conversations. --> | ||||||
|         <core-user-avatar *ngIf="conversation.type != typeGroup" core-user-avatar [user]="conversation.otherUser" |         <core-user-avatar *ngIf="conversation.type != typeGroup" core-user-avatar [user]="conversation.otherUser" [linkProfile]="false" | ||||||
|             [linkProfile]="false" [checkOnline]="conversation.showonlinestatus" slot="start"></core-user-avatar> |             [checkOnline]="conversation.showonlinestatus" slot="start"></core-user-avatar> | ||||||
| 
 | 
 | ||||||
|         <ion-label> |         <ion-label> | ||||||
|             <div class="flex-row ion-justify-content-between"> |             <div class="flex-row ion-justify-content-between"> | ||||||
|                 <p class="item-heading"> |                 <p class="item-heading"> | ||||||
|                     <core-format-text [text]="conversation.name" contextLevel="system" [contextInstanceId]="0"></core-format-text> |                     <core-format-text [text]="conversation.name" contextLevel="system" [contextInstanceId]="0"></core-format-text> | ||||||
|                     <ion-icon name="fas-user-slash" *ngIf="conversation.isblocked" |                     <ion-icon name="fas-user-slash" *ngIf="conversation.isblocked" [title]="'addon.messages.contactblocked' | translate"> | ||||||
|                         [title]="'addon.messages.contactblocked' | translate"></ion-icon> |                     </ion-icon> | ||||||
|                     <ion-icon *ngIf="conversation.ismuted" name="fas-volume-mute" |                     <ion-icon *ngIf="conversation.ismuted" name="fas-volume-mute" [title]="'addon.messages.mutedconversation' | translate"> | ||||||
|                         [title]="'addon.messages.mutedconversation' | translate"></ion-icon> |                     </ion-icon> | ||||||
|                 </p> |                 </p> | ||||||
|                 <ion-note *ngIf="conversation.lastmessagedate > 0 || conversation.unreadcount"> |                 <ion-note *ngIf="conversation.lastmessagedate > 0 || conversation.unreadcount"> | ||||||
|                     <span *ngIf="conversation.lastmessagedate > 0" class="addon-message-last-message-date"> |                     <span *ngIf="conversation.lastmessagedate > 0" class="addon-message-last-message-date"> | ||||||
| @ -180,16 +177,17 @@ | |||||||
|                     </span> |                     </span> | ||||||
|                 </ion-note> |                 </ion-note> | ||||||
|             </div> |             </div> | ||||||
|             <p *ngIf="conversation.subname"><core-format-text [text]="conversation.subname" contextLevel="system" |             <p *ngIf="conversation.subname"> | ||||||
|                 [contextInstanceId]="0"></core-format-text></p> |                 <core-format-text [text]="conversation.subname" contextLevel="system" [contextInstanceId]="0"></core-format-text> | ||||||
|  |             </p> | ||||||
|             <p class="addon-message-last-message"> |             <p class="addon-message-last-message"> | ||||||
|                 <span *ngIf="conversation.sentfromcurrentuser" class="addon-message-last-message-user"> |                 <span *ngIf="conversation.sentfromcurrentuser" class="addon-message-last-message-user"> | ||||||
|                     {{ 'addon.messages.you' | translate }} |                     {{ 'addon.messages.you' | translate }} | ||||||
|                 </span> |                 </span> | ||||||
|                 <span *ngIf="!conversation.sentfromcurrentuser && conversation.type == typeGroup && conversation.members[0]" |                 <span *ngIf="!conversation.sentfromcurrentuser && conversation.type == typeGroup && conversation.members[0]" | ||||||
|                     class="addon-message-last-message-user">{{ conversation.members[0].fullname + ':' }}</span> |                     class="addon-message-last-message-user">{{ conversation.members[0].fullname + ':' }}</span> | ||||||
|                 <core-format-text clean="true" singleLine="true" [text]="conversation.lastmessage" |                 <core-format-text clean="true" singleLine="true" [text]="conversation.lastmessage" class="addon-message-last-message-text" | ||||||
|                     class="addon-message-last-message-text" contextLevel="system" [contextInstanceId]="0"></core-format-text> |                     contextLevel="system" [contextInstanceId]="0"></core-format-text> | ||||||
|             </p> |             </p> | ||||||
|         </ion-label> |         </ion-label> | ||||||
|     </ion-item> |     </ion-item> | ||||||
|  | |||||||
| @ -3,7 +3,9 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1>{{ 'addon.messages.searchcombined' | translate }}</h1> |             <h1>{{ 'addon.messages.searchcombined' | translate }}</h1> | ||||||
|  |         </ion-title> | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| @ -23,8 +25,7 @@ | |||||||
|                     [error]="messages.loadMoreError"></core-infinite-loading> |                     [error]="messages.loadMoreError"></core-infinite-loading> | ||||||
|             </ion-list> |             </ion-list> | ||||||
| 
 | 
 | ||||||
|             <core-empty-box |             <core-empty-box *ngIf="displayResults && !contacts.results.length && !nonContacts.results.length && !messages.results.length" | ||||||
|                 *ngIf="displayResults && !contacts.results.length && !nonContacts.results.length && !messages.results.length" |  | ||||||
|                 icon="fas-search" [message]="'core.noresults' | translate"> |                 icon="fas-search" [message]="'core.noresults' | translate"> | ||||||
|             </core-empty-box> |             </core-empty-box> | ||||||
|         </core-loading> |         </core-loading> | ||||||
| @ -35,20 +36,20 @@ | |||||||
| <ng-template #resultsTemplate let-item="item"> | <ng-template #resultsTemplate let-item="item"> | ||||||
|     <ng-container *ngIf="item.results.length > 0"> |     <ng-container *ngIf="item.results.length > 0"> | ||||||
|         <ion-item-divider class="ion-text-wrap"> |         <ion-item-divider class="ion-text-wrap"> | ||||||
|             <ion-label><h2>{{ item.titleString | translate }}</h2></ion-label> |             <ion-label> | ||||||
|  |                 <h2>{{ item.titleString | translate }}</h2> | ||||||
|  |             </ion-label> | ||||||
|         </ion-item-divider> |         </ion-item-divider> | ||||||
| 
 | 
 | ||||||
|         <!-- List of results --> |         <!-- List of results --> | ||||||
|         <ion-item class="addon-message-discussion ion-text-wrap" *ngFor="let result of item.results" [attr.aria-label]="result.fullname" |         <ion-item class="addon-message-discussion ion-text-wrap" *ngFor="let result of item.results" [attr.aria-label]="result.fullname" | ||||||
|             (click)="openConversation(result)" [attr.aria-current]="result == selectedResult ? 'page' : 'false'" detail="true" |             (click)="openConversation(result)" [attr.aria-current]="result == selectedResult ? 'page' : 'false'" detail="true" button> | ||||||
|             button> |  | ||||||
|             <core-user-avatar slot="start" [user]="result" [checkOnline]="true" [linkProfile]="false"></core-user-avatar> |             <core-user-avatar slot="start" [user]="result" [checkOnline]="true" [linkProfile]="false"></core-user-avatar> | ||||||
|             <ion-label> |             <ion-label> | ||||||
|                 <p class="item-heading"> |                 <p class="item-heading"> | ||||||
|                     <core-format-text [text]="result.fullname" [highlight]="result.highlightName" [filter]="false"> |                     <core-format-text [text]="result.fullname" [highlight]="result.highlightName" [filter]="false"> | ||||||
|                     </core-format-text> |                     </core-format-text> | ||||||
|                     <ion-icon name="fas-ban" *ngIf="result.isblocked" |                     <ion-icon name="fas-ban" *ngIf="result.isblocked" [attr.aria-label]="'addon.messages.contactblocked' | translate"> | ||||||
|                         [attr.aria-label]="'addon.messages.contactblocked' | translate"> |  | ||||||
|                     </ion-icon> |                     </ion-icon> | ||||||
|                 </p> |                 </p> | ||||||
|                 <ion-note *ngIf="result.lastmessagedate > 0"> |                 <ion-note *ngIf="result.lastmessagedate > 0"> | ||||||
| @ -58,9 +59,8 @@ | |||||||
|                     <span *ngIf="result.sentfromcurrentuser" class="addon-message-last-message-user"> |                     <span *ngIf="result.sentfromcurrentuser" class="addon-message-last-message-user"> | ||||||
|                         {{ 'addon.messages.you' | translate }} |                         {{ 'addon.messages.you' | translate }} | ||||||
|                     </span> |                     </span> | ||||||
|                     <core-format-text clean="true" singleLine="true" [text]="result.lastmessage" |                     <core-format-text clean="true" singleLine="true" [text]="result.lastmessage" [highlight]="result.highlightMessage" | ||||||
|                         [highlight]="result.highlightMessage" contextLevel="system" [contextInstanceId]="0" |                         contextLevel="system" [contextInstanceId]="0" class="addon-message-last-message-text"></core-format-text> | ||||||
|                         class="addon-message-last-message-text"></core-format-text> |  | ||||||
|                 </p> |                 </p> | ||||||
|             </ion-label> |             </ion-label> | ||||||
|         </ion-item> |         </ion-item> | ||||||
|  | |||||||
| @ -3,7 +3,9 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1>{{ 'addon.messages.messages' | translate }}</h1> |             <h1>{{ 'addon.messages.messages' | translate }}</h1> | ||||||
|  |         </ion-title> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content> | ||||||
| @ -22,7 +24,9 @@ | |||||||
|             <ion-list *ngIf="advancedContactable" class="ion-text-wrap"> |             <ion-list *ngIf="advancedContactable" class="ion-text-wrap"> | ||||||
|                 <ion-radio-group [(ngModel)]="contactablePrivacy" (ionChange)="saveContactablePrivacy(contactablePrivacy)"> |                 <ion-radio-group [(ngModel)]="contactablePrivacy" (ionChange)="saveContactablePrivacy(contactablePrivacy)"> | ||||||
|                     <ion-item-divider> |                     <ion-item-divider> | ||||||
|                         <ion-label><h2>{{ 'addon.messages.contactableprivacy' | translate }}</h2></ion-label> |                         <ion-label> | ||||||
|  |                             <h2>{{ 'addon.messages.contactableprivacy' | translate }}</h2> | ||||||
|  |                         </ion-label> | ||||||
|                     </ion-item-divider> |                     </ion-item-divider> | ||||||
|                     <ion-item> |                     <ion-item> | ||||||
|                         <ion-label>{{ 'addon.messages.contactableprivacy_onlycontacts' | translate }}</ion-label> |                         <ion-label>{{ 'addon.messages.contactableprivacy_onlycontacts' | translate }}</ion-label> | ||||||
| @ -66,16 +70,9 @@ | |||||||
|                         <ng-container *ngIf="groupMessagingEnabled"> |                         <ng-container *ngIf="groupMessagingEnabled"> | ||||||
|                             <ion-item class="ion-text-wrap"> |                             <ion-item class="ion-text-wrap"> | ||||||
|                                 <ion-label>{{ processor.displayname }}</ion-label> |                                 <ion-label>{{ processor.displayname }}</ion-label> | ||||||
|                                 <core-button-with-spinner |                                 <core-button-with-spinner *ngIf="!preferences.disableall" [loading]="!!notification.updating" slot="end"> | ||||||
|                                     *ngIf="!preferences.disableall" |                                     <ion-toggle *ngIf="!processor.locked" [(ngModel)]="processor.checked" | ||||||
|                                     [loading]="!!notification.updating" |                                         (ngModelChange)="changePreference(notification, '', processor)"> | ||||||
|                                     slot="end" |  | ||||||
|                                 > |  | ||||||
|                                     <ion-toggle |  | ||||||
|                                         *ngIf="!processor.locked" |  | ||||||
|                                         [(ngModel)]="processor.checked" |  | ||||||
|                                         (ngModelChange)="changePreference(notification, '', processor)" |  | ||||||
|                                     > |  | ||||||
|                                     </ion-toggle> |                                     </ion-toggle> | ||||||
|                                     <ion-note *ngIf="processor.locked"> |                                     <ion-note *ngIf="processor.locked"> | ||||||
|                                         {{ processor.lockedmessage }} |                                         {{ processor.lockedmessage }} | ||||||
| @ -92,15 +89,11 @@ | |||||||
|                             <ion-row class="ion-text-wrap ion-hide-md-down ion-align-items-center"> |                             <ion-row class="ion-text-wrap ion-hide-md-down ion-align-items-center"> | ||||||
|                                 <ion-col class="ion-margin-horizontal">{{ processor.displayname }}</ion-col> |                                 <ion-col class="ion-margin-horizontal">{{ processor.displayname }}</ion-col> | ||||||
|                                 <ion-col size="2" class="ion-text-center" *ngFor="let state of ['loggedin', 'loggedoff']"> |                                 <ion-col size="2" class="ion-text-center" *ngFor="let state of ['loggedin', 'loggedoff']"> | ||||||
|                                     <core-button-with-spinner |                                     <core-button-with-spinner *ngIf="!preferences.disableall" | ||||||
|                                         *ngIf="!preferences.disableall" |                                         [loading]="notification.updating && notification.updating[state]"> | ||||||
|                                         [loading]="notification.updating && notification.updating[state]" |  | ||||||
|                                     > |  | ||||||
|                                         <!-- If notifications not disabled, show toggle. --> |                                         <!-- If notifications not disabled, show toggle. --> | ||||||
|                                         <ion-toggle *ngIf="!processor.locked" |                                         <ion-toggle *ngIf="!processor.locked" [(ngModel)]="processor[state].checked" | ||||||
|                                             [(ngModel)]="processor[state].checked" |                                             (ngModelChange)="changePreference(notification, state, processor)"> | ||||||
|                                             (ngModelChange)="changePreference(notification, state, processor)" |  | ||||||
|                                         > |  | ||||||
|                                         </ion-toggle> |                                         </ion-toggle> | ||||||
|                                         <div class="ion-padding text-gray" *ngIf="processor.locked"> |                                         <div class="ion-padding text-gray" *ngIf="processor.locked"> | ||||||
|                                             {{'core.settings.locked' | translate }} |                                             {{'core.settings.locked' | translate }} | ||||||
| @ -118,14 +111,10 @@ | |||||||
|                                 If notifications are disabled, show "Disabled" instead of toggle. --> |                                 If notifications are disabled, show "Disabled" instead of toggle. --> | ||||||
|                             <ion-item *ngFor="let state of ['loggedin', 'loggedoff']" class="ion-text-wrap ion-hide-md-up"> |                             <ion-item *ngFor="let state of ['loggedin', 'loggedoff']" class="ion-text-wrap ion-hide-md-up"> | ||||||
|                                 <ion-label>{{ 'core.settings.' + state | translate }}</ion-label> |                                 <ion-label>{{ 'core.settings.' + state | translate }}</ion-label> | ||||||
|                                 <core-button-with-spinner slot="end" |                                 <core-button-with-spinner slot="end" *ngIf="!preferences.disableall" | ||||||
|                                     *ngIf="!preferences.disableall" |                                     [loading]="notification.updating && notification.updating[state]"> | ||||||
|                                     [loading]="notification.updating && notification.updating[state]" |                                     <ion-toggle *ngIf="!processor.locked" [(ngModel)]="processor[state].checked" | ||||||
|                                 > |                                         (ngModelChange)="changePreference(notification, state, processor)"> | ||||||
|                                     <ion-toggle *ngIf="!processor.locked" |  | ||||||
|                                         [(ngModel)]="processor[state].checked" |  | ||||||
|                                         (ngModelChange)="changePreference(notification, state, processor)" |  | ||||||
|                                     > |  | ||||||
|                                     </ion-toggle> |                                     </ion-toggle> | ||||||
|                                     <ion-note *ngIf="processor.locked"> |                                     <ion-note *ngIf="processor.locked"> | ||||||
|                                         {{'core.settings.locked' | translate }} |                                         {{'core.settings.locked' | translate }} | ||||||
| @ -144,7 +133,11 @@ | |||||||
|         <!-- General settings. --> |         <!-- General settings. --> | ||||||
|         <ion-card> |         <ion-card> | ||||||
|             <ion-list class="ion-text-wrap"> |             <ion-list class="ion-text-wrap"> | ||||||
|                 <ion-item-divider><ion-label><h2>{{ 'core.settings.general' | translate }}</h2></ion-label></ion-item-divider> |                 <ion-item-divider> | ||||||
|  |                     <ion-label> | ||||||
|  |                         <h2>{{ 'core.settings.general' | translate }}</h2> | ||||||
|  |                     </ion-label> | ||||||
|  |                 </ion-item-divider> | ||||||
|                 <ion-item class="ion-text-wrap"> |                 <ion-item class="ion-text-wrap"> | ||||||
|                     <ion-label> |                     <ion-label> | ||||||
|                         <p class="item-heading">{{ 'addon.messages.useentertosend' | translate }}</p> |                         <p class="item-heading">{{ 'addon.messages.useentertosend' | translate }}</p> | ||||||
|  | |||||||
| @ -1,6 +1,8 @@ | |||||||
| <ion-header> | <ion-header> | ||||||
|     <ion-toolbar> |     <ion-toolbar> | ||||||
|  |         <ion-title> | ||||||
|             <h2>{{ plugin.name }}</h2> |             <h2>{{ plugin.name }}</h2> | ||||||
|  |         </ion-title> | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate"> |             <ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate"> | ||||||
|                 <ion-icon slot="icon-only" name="fas-times" aria-hidden="true"></ion-icon> |                 <ion-icon slot="icon-only" name="fas-times" aria-hidden="true"></ion-icon> | ||||||
| @ -10,8 +12,7 @@ | |||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content> | ||||||
|     <form name="addon-mod_assign-edit-feedback-form" *ngIf="userId && plugin" #editFeedbackForm> |     <form name="addon-mod_assign-edit-feedback-form" *ngIf="userId && plugin" #editFeedbackForm> | ||||||
|         <addon-mod-assign-feedback-plugin [assign]="assign" [submission]="submission" [userId]="userId" |         <addon-mod-assign-feedback-plugin [assign]="assign" [submission]="submission" [userId]="userId" [plugin]="plugin" [edit]="true"> | ||||||
|             [plugin]="plugin" [edit]="true"> |  | ||||||
|         </addon-mod-assign-feedback-plugin> |         </addon-mod-assign-feedback-plugin> | ||||||
|         <ion-button expand="block" (click)="done($event)">{{ 'core.done' | translate }}</ion-button> |         <ion-button expand="block" (click)="done($event)">{{ 'core.done' | translate }}</ion-button> | ||||||
|     </form> |     </form> | ||||||
|  | |||||||
| @ -3,10 +3,12 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1> |             <h1> | ||||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="moduleId" [courseId]="courseId"> |                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="moduleId" [courseId]="courseId"> | ||||||
|                 </core-format-text> |                 </core-format-text> | ||||||
|             </h1> |             </h1> | ||||||
|  |         </ion-title> | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <ion-button fill="clear" (click)="save()"> |             <ion-button fill="clear" (click)="save()"> | ||||||
|                 {{ 'core.save' | translate }} |                 {{ 'core.save' | translate }} | ||||||
|  | |||||||
| @ -3,10 +3,12 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1> |             <h1> | ||||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> |                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> | ||||||
|                 </core-format-text> |                 </core-format-text> | ||||||
|             </h1> |             </h1> | ||||||
|  |         </ion-title> | ||||||
| 
 | 
 | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <!-- The buttons defined by the component will be added in here. --> |             <!-- The buttons defined by the component will be added in here. --> | ||||||
|  | |||||||
| @ -3,10 +3,12 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1> |             <h1> | ||||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="moduleId" [courseId]="courseId"> |                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="moduleId" [courseId]="courseId"> | ||||||
|                 </core-format-text> |                 </core-format-text> | ||||||
|             </h1> |             </h1> | ||||||
|  |         </ion-title> | ||||||
| 
 | 
 | ||||||
|         <ion-buttons slot="end"></ion-buttons> |         <ion-buttons slot="end"></ion-buttons> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
|  | |||||||
| @ -3,10 +3,12 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1> |             <h1> | ||||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="moduleId" [courseId]="courseId"> |                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="moduleId" [courseId]="courseId"> | ||||||
|                 </core-format-text> |                 </core-format-text> | ||||||
|             </h1> |             </h1> | ||||||
|  |         </ion-title> | ||||||
| 
 | 
 | ||||||
|         <ion-buttons slot="end"></ion-buttons> |         <ion-buttons slot="end"></ion-buttons> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
|  | |||||||
| @ -1,6 +1,8 @@ | |||||||
| <ion-header> | <ion-header> | ||||||
|     <ion-toolbar> |     <ion-toolbar> | ||||||
|         <h1>{{ 'addon.mod_book.toc' | translate }}</h1> |         <ion-title> | ||||||
|  |             <h2>{{ 'addon.mod_book.toc' | translate }}</h2> | ||||||
|  |         </ion-title> | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate"> |             <ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate"> | ||||||
|                 <ion-icon name="fas-times" slot="icon-only" aria-hidden=true></ion-icon> |                 <ion-icon name="fas-times" slot="icon-only" aria-hidden=true></ion-icon> | ||||||
| @ -12,14 +14,12 @@ | |||||||
|     <nav> |     <nav> | ||||||
|         <ion-list> |         <ion-list> | ||||||
|             <ion-item class="ion-text-wrap" *ngFor="let chapter of chapters" (click)="loadChapter(chapter.id)" |             <ion-item class="ion-text-wrap" *ngFor="let chapter of chapters" (click)="loadChapter(chapter.id)" | ||||||
|                 [attr.aria-current]="selected == chapter.id ? 'page' : 'false'" button |                 [attr.aria-current]="selected == chapter.id ? 'page' : 'false'" button [class.item-dimmed]="chapter.hidden" detail="false"> | ||||||
|                 [class.item-dimmed]="chapter.hidden" detail="false"> |  | ||||||
|                 <ion-label> |                 <ion-label> | ||||||
|                     <p [class.ion-padding-start]="addPadding && chapter.level == 1 ? true : null" class="item-heading"> |                     <p [class.ion-padding-start]="addPadding && chapter.level == 1 ? true : null" class="item-heading"> | ||||||
|                         <span *ngIf="showNumbers" class="addon-mod-book-number">{{chapter.indexNumber}} </span> |                         <span *ngIf="showNumbers" class="addon-mod-book-number">{{chapter.indexNumber}} </span> | ||||||
|                         <span *ngIf="showBullets" class="addon-mod-book-bullet">• </span> |                         <span *ngIf="showBullets" class="addon-mod-book-bullet">• </span> | ||||||
|                         <core-format-text [text]="chapter.title" contextLevel="module" [contextInstanceId]="moduleId" |                         <core-format-text [text]="chapter.title" contextLevel="module" [contextInstanceId]="moduleId" [courseId]="courseId"> | ||||||
|                             [courseId]="courseId"> |  | ||||||
|                         </core-format-text> |                         </core-format-text> | ||||||
|                     </p> |                     </p> | ||||||
|                 </ion-label> |                 </ion-label> | ||||||
|  | |||||||
| @ -3,10 +3,12 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1> |             <h1> | ||||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> |                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> | ||||||
|                 </core-format-text> |                 </core-format-text> | ||||||
|             </h1> |             </h1> | ||||||
|  |         </ion-title> | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <!-- The buttons defined by the component will be added in here. --> |             <!-- The buttons defined by the component will be added in here. --> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  | |||||||
| @ -1,9 +1,8 @@ | |||||||
| <ion-header> | <ion-header> | ||||||
|     <ion-toolbar> |     <ion-toolbar> | ||||||
|         <ion-buttons slot="start"> |         <ion-title> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |  | ||||||
|         </ion-buttons> |  | ||||||
|             <h2>{{ 'addon.mod_chat.currentusers' | translate }}</h2> |             <h2>{{ 'addon.mod_chat.currentusers' | translate }}</h2> | ||||||
|  |         </ion-title> | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate"> |             <ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate"> | ||||||
|                 <ion-icon slot="icon-only" name="fas-times" aria-hidden="true"></ion-icon> |                 <ion-icon slot="icon-only" name="fas-times" aria-hidden="true"></ion-icon> | ||||||
| @ -13,8 +12,7 @@ | |||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content> | ||||||
|     <core-loading [hideUntil]="usersLoaded"> |     <core-loading [hideUntil]="usersLoaded"> | ||||||
|         <ion-item class="ion-text-wrap" *ngFor="let user of users" |         <ion-item class="ion-text-wrap" *ngFor="let user of users" [class.addon-mod-chat-user]="currentUserId != user.id && isOnline"> | ||||||
|             [class.addon-mod-chat-user]="currentUserId != user.id && isOnline"> |  | ||||||
| 
 | 
 | ||||||
|             <core-user-avatar [user]="user" slot="start" [linkProfile]="false"></core-user-avatar> |             <core-user-avatar [user]="user" slot="start" [linkProfile]="false"></core-user-avatar> | ||||||
|             <ion-label> |             <ion-label> | ||||||
|  | |||||||
| @ -3,10 +3,12 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1> |             <h1> | ||||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId"> |                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId"> | ||||||
|                 </core-format-text> |                 </core-format-text> | ||||||
|             </h1> |             </h1> | ||||||
|  |         </ion-title> | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <ion-button fill="clear" *ngIf="loaded" (click)="showChatUsers()" [attr.aria-label]="'core.users' | translate"> |             <ion-button fill="clear" *ngIf="loaded" (click)="showChatUsers()" [attr.aria-label]="'core.users' | translate"> | ||||||
|                 <ion-icon name="fas-users" slot="icon-only" aria-hidden="true"></ion-icon> |                 <ion-icon name="fas-users" slot="icon-only" aria-hidden="true"></ion-icon> | ||||||
| @ -81,8 +83,7 @@ | |||||||
| 
 | 
 | ||||||
|                 <ion-item *ngIf="!message.special" class="ion-text-wrap addon-message" |                 <ion-item *ngIf="!message.special" class="ion-text-wrap addon-message" | ||||||
|                     [class.addon-message-mine]="message.userid == currentUserId" |                     [class.addon-message-mine]="message.userid == currentUserId" | ||||||
|                     [class.addon-message-not-mine]="message.userid != currentUserId" |                     [class.addon-message-not-mine]="message.userid != currentUserId" [class.addon-message-no-user]="!message.showUserData" | ||||||
|                     [class.addon-message-no-user]="!message.showUserData" |  | ||||||
|                     [@coreSlideInOut]="message.userid == currentUserId ? '' : 'fromLeft'"> |                     [@coreSlideInOut]="message.userid == currentUserId ? '' : 'fromLeft'"> | ||||||
|                     <ion-label> |                     <ion-label> | ||||||
|                         <!-- User data. --> |                         <!-- User data. --> | ||||||
| @ -104,8 +105,7 @@ | |||||||
|             </ng-container> |             </ng-container> | ||||||
|         </ion-list> |         </ion-list> | ||||||
| 
 | 
 | ||||||
|         <core-empty-box *ngIf="!messages || messages.length <= 0" icon="far-comments" |         <core-empty-box *ngIf="!messages || messages.length <= 0" icon="far-comments" [message]="'addon.mod_chat.nomessages' | translate"> | ||||||
|             [message]="'addon.mod_chat.nomessages' | translate"> |  | ||||||
|         </core-empty-box> |         </core-empty-box> | ||||||
|     </core-loading> |     </core-loading> | ||||||
| </ion-content> | </ion-content> | ||||||
|  | |||||||
| @ -3,10 +3,12 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1> |             <h1> | ||||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> |                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> | ||||||
|                 </core-format-text> |                 </core-format-text> | ||||||
|             </h1> |             </h1> | ||||||
|  |         </ion-title> | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <!-- The buttons defined by the component will be added in here. --> |             <!-- The buttons defined by the component will be added in here. --> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  | |||||||
| @ -3,7 +3,9 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1>{{ 'addon.mod_chat.messages' | translate }}</h1> |             <h1>{{ 'addon.mod_chat.messages' | translate }}</h1> | ||||||
|  |         </ion-title> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content> | ||||||
| @ -75,8 +77,7 @@ | |||||||
| 
 | 
 | ||||||
|                 <ion-item *ngIf="!message.special" class="ion-text-wrap addon-message" |                 <ion-item *ngIf="!message.special" class="ion-text-wrap addon-message" | ||||||
|                     [class.addon-message-mine]="message.userid == currentUserId" |                     [class.addon-message-mine]="message.userid == currentUserId" | ||||||
|                     [class.addon-message-not-mine]="message.userid != currentUserId" |                     [class.addon-message-not-mine]="message.userid != currentUserId" [class.addon-message-no-user]="!message.showUserData"> | ||||||
|                     [class.addon-message-no-user]="!message.showUserData"> |  | ||||||
|                     <ion-label> |                     <ion-label> | ||||||
|                         <!-- User data. --> |                         <!-- User data. --> | ||||||
|                         <h2 class="addon-message-user"> |                         <h2 class="addon-message-user"> | ||||||
|  | |||||||
| @ -3,7 +3,9 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1>{{ 'addon.mod_chat.chatreport' | translate }}</h1> |             <h1>{{ 'addon.mod_chat.chatreport' | translate }}</h1> | ||||||
|  |         </ion-title> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content> | ||||||
|  | |||||||
| @ -3,10 +3,12 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1> |             <h1> | ||||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> |                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> | ||||||
|                 </core-format-text> |                 </core-format-text> | ||||||
|             </h1> |             </h1> | ||||||
|  |         </ion-title> | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <!-- The buttons defined by the component will be added in here. --> |             <!-- The buttons defined by the component will be added in here. --> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  | |||||||
| @ -1,9 +1,8 @@ | |||||||
| <ion-header> | <ion-header> | ||||||
|     <ion-toolbar> |     <ion-toolbar> | ||||||
|         <ion-buttons slot="start"> |         <ion-title> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |  | ||||||
|         </ion-buttons> |  | ||||||
|             <h2>{{ 'addon.mod_data.search' | translate }}</h2> |             <h2>{{ 'addon.mod_data.search' | translate }}</h2> | ||||||
|  |         </ion-title> | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate"> |             <ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate"> | ||||||
|                 <ion-icon name="fas-times" slot="icon-only" aria-hidden=true></ion-icon> |                 <ion-icon name="fas-times" slot="icon-only" aria-hidden=true></ion-icon> | ||||||
| @ -20,14 +19,14 @@ | |||||||
|         <ion-list class="ion-no-margin"> |         <ion-list class="ion-no-margin"> | ||||||
|             <ion-item [hidden]="search.searchingAdvanced"> |             <ion-item [hidden]="search.searchingAdvanced"> | ||||||
|                 <ion-label class="sr-only">{{ 'addon.mod_data.search' | translate}}</ion-label> |                 <ion-label class="sr-only">{{ 'addon.mod_data.search' | translate}}</ion-label> | ||||||
|                 <ion-input type="text" placeholder="{{ 'addon.mod_data.search' | translate}}" |                 <ion-input type="text" placeholder="{{ 'addon.mod_data.search' | translate}}" [(ngModel)]="search.text" name="text" | ||||||
|                     [(ngModel)]="search.text" name="text" formControlName="text"> |                     formControlName="text"> | ||||||
|                 </ion-input> |                 </ion-input> | ||||||
|             </ion-item> |             </ion-item> | ||||||
|             <ion-item class="ion-text-wrap"> |             <ion-item class="ion-text-wrap"> | ||||||
|                 <ion-label position="stacked">{{ 'core.sortby' | translate }}</ion-label> |                 <ion-label position="stacked">{{ 'core.sortby' | translate }}</ion-label> | ||||||
|                 <ion-select interface="action-sheet" name="sortBy" formControlName="sortBy" |                 <ion-select interface="action-sheet" name="sortBy" formControlName="sortBy" [placeholder]="'core.sortby' | translate" | ||||||
|                     [placeholder]="'core.sortby' | translate" [interfaceOptions]="{header: 'core.sortby' | translate}"> |                     [interfaceOptions]="{header: 'core.sortby' | translate}"> | ||||||
|                     <optgroup *ngIf="fieldsArray.length" label="{{ 'addon.mod_data.fields' | translate }}"> |                     <optgroup *ngIf="fieldsArray.length" label="{{ 'addon.mod_data.fields' | translate }}"> | ||||||
|                         <ion-select-option *ngFor="let field of fieldsArray" [value]="field.id">{{field.name}}</ion-select-option> |                         <ion-select-option *ngFor="let field of fieldsArray" [value]="field.id">{{field.name}}</ion-select-option> | ||||||
|                     </optgroup> |                     </optgroup> | ||||||
| @ -42,7 +41,7 @@ | |||||||
|                     </optgroup> |                     </optgroup> | ||||||
|                 </ion-select> |                 </ion-select> | ||||||
|             </ion-item> |             </ion-item> | ||||||
|             <ion-list > |             <ion-list> | ||||||
|                 <ion-radio-group [(ngModel)]="search.sortDirection" name="sortDirection" formControlName="sortDirection"> |                 <ion-radio-group [(ngModel)]="search.sortDirection" name="sortDirection" formControlName="sortDirection"> | ||||||
|                     <ion-item> |                     <ion-item> | ||||||
|                         <ion-label>{{ 'addon.mod_data.ascending' | translate }}</ion-label> |                         <ion-label>{{ 'addon.mod_data.ascending' | translate }}</ion-label> | ||||||
|  | |||||||
| @ -3,10 +3,12 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1> |             <h1> | ||||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId"> |                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId"> | ||||||
|                 </core-format-text> |                 </core-format-text> | ||||||
|             </h1> |             </h1> | ||||||
|  |         </ion-title> | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <ion-button *ngIf="entry" fill="clear" (click)="save($event)"> |             <ion-button *ngIf="entry" fill="clear" (click)="save($event)"> | ||||||
|                 {{ 'core.save' | translate }} |                 {{ 'core.save' | translate }} | ||||||
|  | |||||||
| @ -3,15 +3,16 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1> |             <h1> | ||||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId"> |                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId"> | ||||||
|                 </core-format-text> |                 </core-format-text> | ||||||
|             </h1> |             </h1> | ||||||
|  |         </ion-title> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content> | ||||||
|     <ion-refresher slot="fixed" |     <ion-refresher slot="fixed" [disabled]="!entryLoaded || !(isPullingToRefresh || !renderingEntry && !loadingRating && !loadingComments)" | ||||||
|         [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> | ||||||
| @ -40,23 +41,23 @@ | |||||||
|         <div class="addon-data-contents addon-data-entry addon-data-entries-{{database.id}}" *ngIf="database && entry"> |         <div class="addon-data-contents addon-data-entry addon-data-entries-{{database.id}}" *ngIf="database && entry"> | ||||||
|             <core-style [css]="database.csstemplate" prefix=".addon-data-entries-{{database.id}}"></core-style> |             <core-style [css]="database.csstemplate" prefix=".addon-data-entries-{{database.id}}"></core-style> | ||||||
| 
 | 
 | ||||||
|             <core-compile-html [text]="entryHtml" [jsData]="jsData" [extraImports]="extraImports" |             <core-compile-html [text]="entryHtml" [jsData]="jsData" [extraImports]="extraImports" (compiling)="setRenderingEntry($event)"> | ||||||
|                 (compiling)="setRenderingEntry($event)"></core-compile-html> |             </core-compile-html> | ||||||
|         </div> |         </div> | ||||||
| 
 | 
 | ||||||
|         <core-rating-rate *ngIf="database && entry && ratingInfo && (!database.approval || entry.approved)" |         <core-rating-rate *ngIf="database && entry && ratingInfo && (!database.approval || entry.approved)" [ratingInfo]="ratingInfo" | ||||||
|             [ratingInfo]="ratingInfo" contextLevel="module" [instanceId]="database.coursemodule" [itemId]="entry.id" [itemSetId]="0" |             contextLevel="module" [instanceId]="database.coursemodule" [itemId]="entry.id" [itemSetId]="0" [courseId]="courseId" | ||||||
|             [courseId]="courseId" [aggregateMethod]="database.assessed" [scaleId]="database.scale" [userId]="entry.userid" |             [aggregateMethod]="database.assessed" [scaleId]="database.scale" [userId]="entry.userid" (onLoading)="setLoadingRating($event)" | ||||||
|             (onLoading)="setLoadingRating($event)" (onUpdate)="ratingUpdated()"> |             (onUpdate)="ratingUpdated()"> | ||||||
|         </core-rating-rate> |         </core-rating-rate> | ||||||
|         <core-rating-aggregate *ngIf="database && entry && ratingInfo" [ratingInfo]="ratingInfo" contextLevel="module" |         <core-rating-aggregate *ngIf="database && entry && ratingInfo" [ratingInfo]="ratingInfo" contextLevel="module" | ||||||
|             [instanceId]="database.coursemodule" [itemId]="entry.id" [courseId]="courseId" [aggregateMethod]="database.assessed" |             [instanceId]="database.coursemodule" [itemId]="entry.id" [courseId]="courseId" [aggregateMethod]="database.assessed" | ||||||
|             [scaleId]="database.scale"> |             [scaleId]="database.scale"> | ||||||
|         </core-rating-aggregate> |         </core-rating-aggregate> | ||||||
| 
 | 
 | ||||||
|         <core-comments *ngIf="database && database.comments && entry && entry.id > 0 && commentsEnabled" |         <core-comments *ngIf="database && database.comments && entry && entry.id > 0 && commentsEnabled" contextLevel="module" | ||||||
|             contextLevel="module" [instanceId]="database.coursemodule" component="mod_data" [itemId]="entry.id" |             [instanceId]="database.coursemodule" component="mod_data" [itemId]="entry.id" area="database_entry" [courseId]="courseId" | ||||||
|             area="database_entry" [courseId]="courseId" (onLoading)="setLoadingComments($event)" [showItem]="true"> |             (onLoading)="setLoadingComments($event)" [showItem]="true"> | ||||||
|         </core-comments> |         </core-comments> | ||||||
| 
 | 
 | ||||||
|         <ion-grid *ngIf="hasPrevious || hasNext"> |         <ion-grid *ngIf="hasPrevious || hasNext"> | ||||||
|  | |||||||
| @ -3,10 +3,12 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1> |             <h1> | ||||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId"> |                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId"> | ||||||
|                 </core-format-text> |                 </core-format-text> | ||||||
|             </h1> |             </h1> | ||||||
|  |         </ion-title> | ||||||
| 
 | 
 | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <!-- The buttons defined by the component will be added in here. --> |             <!-- The buttons defined by the component will be added in here. --> | ||||||
|  | |||||||
| @ -3,12 +3,12 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|         <h1> |         <ion-title> | ||||||
|             <ng-container *ngIf="attempt">{{ attempt.fullname }}</ng-container> |             <h1 *ngIf="attempt">{{ attempt.fullname }}</h1> | ||||||
|             <ng-container *ngIf="anonAttempt"> |             <h1 *ngIf="anonAttempt"> | ||||||
|                 {{ 'addon.mod_feedback.response_nr' |translate }}: {{anonAttempt.number}} |                 {{ 'addon.mod_feedback.response_nr' |translate }}: {{anonAttempt.number}} | ||||||
|             </ng-container> |  | ||||||
|             </h1> |             </h1> | ||||||
|  |         </ion-title> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content> | ||||||
| @ -30,7 +30,7 @@ | |||||||
|                         ({{ 'addon.mod_feedback.anonymous' |translate }}) |                         ({{ 'addon.mod_feedback.anonymous' |translate }}) | ||||||
|                     </h2> |                     </h2> | ||||||
|                 </ion-label> |                 </ion-label> | ||||||
|             </ion-item > |             </ion-item> | ||||||
|             <ng-container *ngIf="items && items.length"> |             <ng-container *ngIf="items && items.length"> | ||||||
|                 <ng-container *ngFor="let item of items"> |                 <ng-container *ngFor="let item of items"> | ||||||
|                     <core-spacer *ngIf="item.typ == 'pagebreak'"></core-spacer> |                     <core-spacer *ngIf="item.typ == 'pagebreak'"></core-spacer> | ||||||
| @ -38,8 +38,8 @@ | |||||||
|                         <ion-label> |                         <ion-label> | ||||||
|                             <h2 *ngIf="item.name" [core-mark-required]="item.required"> |                             <h2 *ngIf="item.name" [core-mark-required]="item.required"> | ||||||
|                                 <span *ngIf="feedback!.autonumbering && item.itemnumber">{{item.itemnumber}}. </span> |                                 <span *ngIf="feedback!.autonumbering && item.itemnumber">{{item.itemnumber}}. </span> | ||||||
|                                 <core-format-text [component]="component" [componentId]="cmId" [text]="item.name" |                                 <core-format-text [component]="component" [componentId]="cmId" [text]="item.name" contextLevel="module" | ||||||
|                                     contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId"> |                                     [contextInstanceId]="cmId" [courseId]="courseId"> | ||||||
|                                 </core-format-text> |                                 </core-format-text> | ||||||
|                             </h2> |                             </h2> | ||||||
|                             <p *ngIf="item.submittedValue"> |                             <p *ngIf="item.submittedValue"> | ||||||
|  | |||||||
| @ -3,10 +3,12 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1> |             <h1> | ||||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId"> |                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId"> | ||||||
|                 </core-format-text> |                 </core-format-text> | ||||||
|             </h1> |             </h1> | ||||||
|  |         </ion-title> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content> | ||||||
| @ -28,22 +30,20 @@ | |||||||
|                             <ion-label [position]="item.hasTextInput ? 'stacked' : undefined"> |                             <ion-label [position]="item.hasTextInput ? 'stacked' : undefined"> | ||||||
|                                 <p *ngIf="item.name" [core-mark-required]="item.required"> |                                 <p *ngIf="item.name" [core-mark-required]="item.required"> | ||||||
|                                     <span *ngIf="feedback!.autonumbering && item.itemnumber">{{item.itemnumber}}. </span> |                                     <span *ngIf="feedback!.autonumbering && item.itemnumber">{{item.itemnumber}}. </span> | ||||||
|                                     <core-format-text [component]="component" [componentId]="cmId" [text]="item.name" |                                     <core-format-text [component]="component" [componentId]="cmId" [text]="item.name" contextLevel="module" | ||||||
|                                         contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId" [wsNotFiltered]="true"> |                                         [contextInstanceId]="cmId" [courseId]="courseId" [wsNotFiltered]="true"> | ||||||
|                                     </core-format-text> |                                     </core-format-text> | ||||||
|                                     <span *ngIf="item.postfix" class="addon-mod_feedback-postfix">{{item.postfix}}</span> |                                     <span *ngIf="item.postfix" class="addon-mod_feedback-postfix">{{item.postfix}}</span> | ||||||
|                                 </p> |                                 </p> | ||||||
|                                 <p *ngIf="item.templateName == 'label'"> |                                 <p *ngIf="item.templateName == 'label'"> | ||||||
|                                     <core-format-text [component]="component" [componentId]="cmId" |                                     <core-format-text [component]="component" [componentId]="cmId" [text]="item.presentation" | ||||||
|                                         [text]="item.presentation" contextLevel="module" [contextInstanceId]="cmId" |                                         contextLevel="module" [contextInstanceId]="cmId" [wsNotFiltered]="true" [courseId]="courseId"> | ||||||
|                                         [wsNotFiltered]="true" [courseId]="courseId"> |  | ||||||
|                                     </core-format-text> |                                     </core-format-text> | ||||||
|                                 </p> |                                 </p> | ||||||
|                             </ion-label> |                             </ion-label> | ||||||
| 
 | 
 | ||||||
|                             <ion-input *ngIf="item.templateName == 'textfield'" type="text" [(ngModel)]="item.value" |                             <ion-input *ngIf="item.templateName == 'textfield'" type="text" [(ngModel)]="item.value" autocorrect="off" | ||||||
|                                 autocorrect="off" name="{{item.typ}}_{{item.id}}" maxlength="{{item.length}}" |                                 name="{{item.typ}}_{{item.id}}" maxlength="{{item.length}}" [required]="item.required"> | ||||||
|                                 [required]="item.required"> |  | ||||||
|                             </ion-input> |                             </ion-input> | ||||||
| 
 | 
 | ||||||
|                             <ng-container *ngIf="item.templateName == 'numeric'"> |                             <ng-container *ngIf="item.templateName == 'numeric'"> | ||||||
| @ -56,8 +56,8 @@ | |||||||
|                                 </ion-text> |                                 </ion-text> | ||||||
|                             </ng-container> |                             </ng-container> | ||||||
| 
 | 
 | ||||||
|                             <ion-textarea *ngIf="item.templateName == 'textarea'" [required]="item.required" |                             <ion-textarea *ngIf="item.templateName == 'textarea'" [required]="item.required" name="{{item.typ}}_{{item.id}}" | ||||||
|                                 name="{{item.typ}}_{{item.id}}" [(ngModel)]="item.value"> |                                 [(ngModel)]="item.value"> | ||||||
|                             </ion-textarea> |                             </ion-textarea> | ||||||
| 
 | 
 | ||||||
|                             <ion-select *ngIf="item.templateName == 'multichoice-d'" [required]="item.required" |                             <ion-select *ngIf="item.templateName == 'multichoice-d'" [required]="item.required" | ||||||
| @ -65,20 +65,18 @@ | |||||||
|                                 [interfaceOptions]="{header: item.name}"> |                                 [interfaceOptions]="{header: item.name}"> | ||||||
|                                 <ion-select-option *ngFor="let option of item.choices" [value]="option.value"> |                                 <ion-select-option *ngFor="let option of item.choices" [value]="option.value"> | ||||||
|                                     <core-format-text [component]="component" [componentId]="cmId" [text]="option.label" |                                     <core-format-text [component]="component" [componentId]="cmId" [text]="option.label" | ||||||
|                                         contextLevel="module" [contextInstanceId]="cmId" [wsNotFiltered]="true" |                                         contextLevel="module" [contextInstanceId]="cmId" [wsNotFiltered]="true" [courseId]="courseId"> | ||||||
|                                         [courseId]="courseId"> |  | ||||||
|                                     </core-format-text> |                                     </core-format-text> | ||||||
|                                 </ion-select-option> |                                 </ion-select-option> | ||||||
|                             </ion-select> |                             </ion-select> | ||||||
|                         </ion-item> |                         </ion-item> | ||||||
| 
 | 
 | ||||||
|                         <ion-radio-group *ngIf="item.templateName == 'multichoice-r'" [(ngModel)]="item.value" |                         <ion-radio-group *ngIf="item.templateName == 'multichoice-r'" [(ngModel)]="item.value" [required]="item.required" | ||||||
|                             [required]="item.required" name="{{item.typ}}_{{item.id}}"> |                             name="{{item.typ}}_{{item.id}}"> | ||||||
|                             <ion-item *ngFor="let option of item.choices"> |                             <ion-item *ngFor="let option of item.choices"> | ||||||
|                                 <ion-label> |                                 <ion-label> | ||||||
|                                     <core-format-text [component]="component" [componentId]="cmId" |                                     <core-format-text [component]="component" [componentId]="cmId" [text]="option.label" | ||||||
|                                         [text]="option.label" contextLevel="module" [contextInstanceId]="cmId" |                                         contextLevel="module" [contextInstanceId]="cmId" [wsNotFiltered]="true" [courseId]="courseId"> | ||||||
|                                         [wsNotFiltered]="true" [courseId]="courseId"> |  | ||||||
|                                     </core-format-text> |                                     </core-format-text> | ||||||
|                                 </ion-label> |                                 </ion-label> | ||||||
|                                 <ion-radio slot="start" [value]="option.value"></ion-radio> |                                 <ion-radio slot="start" [value]="option.value"></ion-radio> | ||||||
| @ -89,19 +87,18 @@ | |||||||
|                             <ion-item *ngFor="let option of item.choices"> |                             <ion-item *ngFor="let option of item.choices"> | ||||||
|                                 <ion-label> |                                 <ion-label> | ||||||
|                                     <core-format-text [component]="component" [componentId]="cmId" [text]="option.label" |                                     <core-format-text [component]="component" [componentId]="cmId" [text]="option.label" | ||||||
|                                         contextLevel="module" [contextInstanceId]="cmId" [wsNotFiltered]="true" |                                         contextLevel="module" [contextInstanceId]="cmId" [wsNotFiltered]="true" [courseId]="courseId"> | ||||||
|                                         [courseId]="courseId"> |  | ||||||
|                                     </core-format-text> |                                     </core-format-text> | ||||||
|                                 </ion-label> |                                 </ion-label> | ||||||
|                                 <ion-checkbox [required]="item.required" name="{{item.typ}}_{{item.id}}" |                                 <ion-checkbox [required]="item.required" name="{{item.typ}}_{{item.id}}" [(ngModel)]="option.checked" | ||||||
|                                     [(ngModel)]="option.checked" value="option.value"> |                                     value="option.value"> | ||||||
|                                 </ion-checkbox> |                                 </ion-checkbox> | ||||||
|                             </ion-item> |                             </ion-item> | ||||||
|                         </ng-container> |                         </ng-container> | ||||||
| 
 | 
 | ||||||
|                         <ng-container *ngIf="item.templateName == 'captcha'"> |                         <ng-container *ngIf="item.templateName == 'captcha'"> | ||||||
|                             <core-recaptcha *ngIf="!preview && !offline" [publicKey]="item.captcha.recaptchapublickey" |                             <core-recaptcha *ngIf="!preview && !offline" [publicKey]="item.captcha.recaptchapublickey" [model]="item" | ||||||
|                                 [model]="item" modelValueName="value"> |                                 modelValueName="value"> | ||||||
|                             </core-recaptcha> |                             </core-recaptcha> | ||||||
|                             <div *ngIf="!preview && (!item.captcha || offline)" class="core-warning-card"> |                             <div *ngIf="!preview && (!item.captcha || offline)" class="core-warning-card"> | ||||||
|                                 <ion-item> |                                 <ion-item> | ||||||
|  | |||||||
| @ -3,10 +3,12 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1> |             <h1> | ||||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> |                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> | ||||||
|                 </core-format-text> |                 </core-format-text> | ||||||
|             </h1> |             </h1> | ||||||
|  |         </ion-title> | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <!-- The buttons defined by the component will be added in here. --> |             <!-- The buttons defined by the component will be added in here. --> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  | |||||||
| @ -3,7 +3,9 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1>{{ 'addon.mod_feedback.responses' |translate }}</h1> |             <h1>{{ 'addon.mod_feedback.responses' |translate }}</h1> | ||||||
|  |         </ion-title> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content> | ||||||
| @ -27,7 +29,9 @@ | |||||||
|             </ion-item> |             </ion-item> | ||||||
| 
 | 
 | ||||||
|             <ion-item-divider> |             <ion-item-divider> | ||||||
|                 <ion-label><h2>{{ 'addon.mod_feedback.non_respondents_students' | translate : {$a: total } }}</h2></ion-label> |                 <ion-label> | ||||||
|  |                     <h2>{{ 'addon.mod_feedback.non_respondents_students' | translate : {$a: total } }}</h2> | ||||||
|  |                 </ion-label> | ||||||
|             </ion-item-divider> |             </ion-item-divider> | ||||||
|             <ng-container *ngIf="total > 0"> |             <ng-container *ngIf="total > 0"> | ||||||
|                 <ion-item *ngFor="let user of users" class="ion-text-wrap"> |                 <ion-item *ngFor="let user of users" class="ion-text-wrap"> | ||||||
|  | |||||||
| @ -3,7 +3,9 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1>{{ 'addon.mod_feedback.responses' |translate }}</h1> |             <h1>{{ 'addon.mod_feedback.responses' |translate }}</h1> | ||||||
|  |         </ion-title> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content> | ||||||
| @ -48,7 +50,9 @@ | |||||||
|                         {{ 'core.loadmore' | translate }} |                         {{ 'core.loadmore' | translate }} | ||||||
|                     </ion-button> |                     </ion-button> | ||||||
|                     <ion-item *ngIf="responses.responses.canLoadMore && loadingMore" class="ion-text-center"> |                     <ion-item *ngIf="responses.responses.canLoadMore && loadingMore" class="ion-text-center"> | ||||||
|                         <ion-label><ion-spinner [attr.aria-label]="'core.loading' | translate"></ion-spinner></ion-label> |                         <ion-label> | ||||||
|  |                             <ion-spinner [attr.aria-label]="'core.loading' | translate"></ion-spinner> | ||||||
|  |                         </ion-label> | ||||||
|                     </ion-item> |                     </ion-item> | ||||||
|                 </ng-container> |                 </ng-container> | ||||||
| 
 | 
 | ||||||
| @ -71,7 +75,9 @@ | |||||||
|                         {{ 'core.loadmore' | translate }} |                         {{ 'core.loadmore' | translate }} | ||||||
|                     </ion-button> |                     </ion-button> | ||||||
|                     <ion-item *ngIf="responses.anonResponses.canLoadMore && loadingMore" class="ion-text-center"> |                     <ion-item *ngIf="responses.anonResponses.canLoadMore && loadingMore" class="ion-text-center"> | ||||||
|                         <ion-label><ion-spinner [attr.aria-label]="'core.loading' | translate"></ion-spinner></ion-label> |                         <ion-label> | ||||||
|  |                             <ion-spinner [attr.aria-label]="'core.loading' | translate"></ion-spinner> | ||||||
|  |                         </ion-label> | ||||||
|                     </ion-item> |                     </ion-item> | ||||||
|                 </ng-container> |                 </ng-container> | ||||||
|             </ion-list> |             </ion-list> | ||||||
|  | |||||||
| @ -3,10 +3,12 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1> |             <h1> | ||||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> |                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> | ||||||
|                 </core-format-text> |                 </core-format-text> | ||||||
|             </h1> |             </h1> | ||||||
|  |         </ion-title> | ||||||
| 
 | 
 | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <!-- The buttons defined by the component will be added in here. --> |             <!-- The buttons defined by the component will be added in here. --> | ||||||
|  | |||||||
| @ -1,6 +1,8 @@ | |||||||
| <ion-header> | <ion-header> | ||||||
|     <ion-toolbar> |     <ion-toolbar> | ||||||
|  |         <ion-title> | ||||||
|             <h2 id="addon-mod-forum-sort-order-label">{{ 'core.sort' | translate }}</h2> |             <h2 id="addon-mod-forum-sort-order-label">{{ 'core.sort' | translate }}</h2> | ||||||
|  |         </ion-title> | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate"> |             <ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate"> | ||||||
|                 <ion-icon name="fas-times" slot="icon-only" aria-hidden="true"></ion-icon> |                 <ion-icon name="fas-times" slot="icon-only" aria-hidden="true"></ion-icon> | ||||||
|  | |||||||
| @ -3,10 +3,12 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1 *ngIf="startingPost"> |             <h1 *ngIf="startingPost"> | ||||||
|                 <core-format-text contextLevel="module" [text]="startingPost.subject" [contextInstanceId]="cmId" [courseId]="courseId"> |                 <core-format-text contextLevel="module" [text]="startingPost.subject" [contextInstanceId]="cmId" [courseId]="courseId"> | ||||||
|                 </core-format-text> |                 </core-format-text> | ||||||
|             </h1> |             </h1> | ||||||
|  |         </ion-title> | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <!-- The context menu will be added in here. --> |             <!-- The context menu will be added in here. --> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
| @ -14,48 +16,41 @@ | |||||||
| </ion-header> | </ion-header> | ||||||
| <core-navbar-buttons slot="end"> | <core-navbar-buttons slot="end"> | ||||||
|     <core-context-menu> |     <core-context-menu> | ||||||
|         <core-context-menu-item *ngIf="discussionLoaded && !postHasOffline && isOnline" |         <core-context-menu-item *ngIf="discussionLoaded && !postHasOffline && isOnline" [priority]="650" | ||||||
|             [priority]="650" [content]="'addon.mod_forum.refreshposts' | translate" [iconAction]="refreshIcon" [closeOnClick]="false" |             [content]="'addon.mod_forum.refreshposts' | translate" [iconAction]="refreshIcon" [closeOnClick]="false" | ||||||
|             (action)="doRefresh(null, $event)"> |             (action)="doRefresh(null, $event)"> | ||||||
|         </core-context-menu-item> |         </core-context-menu-item> | ||||||
|         <core-context-menu-item *ngIf="discussionLoaded && isMobile && postHasOffline && isOnline" |         <core-context-menu-item *ngIf="discussionLoaded && isMobile && postHasOffline && isOnline" [priority]="550" | ||||||
|             [priority]="550" [content]="'core.settings.synchronizenow' | translate" [iconAction]="syncIcon" [closeOnClick]="false" |             [content]="'core.settings.synchronizenow' | translate" [iconAction]="syncIcon" [closeOnClick]="false" | ||||||
|             (action)="doRefresh(null, $event, true)"> |             (action)="doRefresh(null, $event, true)"> | ||||||
|         </core-context-menu-item> |         </core-context-menu-item> | ||||||
|         <core-context-menu-item [hidden]="sort == 'flat-oldest'" |         <core-context-menu-item [hidden]="sort == 'flat-oldest'" [priority]="500" | ||||||
|             [priority]="500" [content]="'addon.mod_forum.modeflatoldestfirst' | translate" iconAction="fas-arrow-down" |             [content]="'addon.mod_forum.modeflatoldestfirst' | translate" iconAction="fas-arrow-down" (action)="changeSort('flat-oldest')"> | ||||||
|             (action)="changeSort('flat-oldest')"> |  | ||||||
|         </core-context-menu-item> |         </core-context-menu-item> | ||||||
|         <core-context-menu-item [hidden]="sort == 'flat-newest'" |         <core-context-menu-item [hidden]="sort == 'flat-newest'" [priority]="450" | ||||||
|             [priority]="450" [content]="'addon.mod_forum.modeflatnewestfirst' | translate" iconAction="fas-arrow-up" |             [content]="'addon.mod_forum.modeflatnewestfirst' | translate" iconAction="fas-arrow-up" (action)="changeSort('flat-newest')"> | ||||||
|             (action)="changeSort('flat-newest')"> |  | ||||||
|         </core-context-menu-item> |         </core-context-menu-item> | ||||||
|         <core-context-menu-item [hidden]="sort == 'nested'" |         <core-context-menu-item [hidden]="sort == 'nested'" [priority]="400" [content]="'addon.mod_forum.modenested' | translate" | ||||||
|             [priority]="400" [content]="'addon.mod_forum.modenested' | translate" iconAction="fas-exchange-alt" |             iconAction="fas-exchange-alt" (action)="changeSort('nested')"> | ||||||
|             (action)="changeSort('nested')"> |  | ||||||
|         </core-context-menu-item> |         </core-context-menu-item> | ||||||
|         <core-context-menu-item [hidden]="!discussion || !discussion.canlock || discussion.locked" |         <core-context-menu-item [hidden]="!discussion || !discussion.canlock || discussion.locked" [priority]="300" | ||||||
|             [priority]="300" [content]="'addon.mod_forum.lockdiscussion' | translate" iconAction="fas-lock" |             [content]="'addon.mod_forum.lockdiscussion' | translate" iconAction="fas-lock" (action)="setLockState(true)"> | ||||||
|             (action)="setLockState(true)"> |  | ||||||
|         </core-context-menu-item> |         </core-context-menu-item> | ||||||
|         <core-context-menu-item [hidden]="!discussion || !discussion.canlock || !discussion.locked" |         <core-context-menu-item [hidden]="!discussion || !discussion.canlock || !discussion.locked" [priority]="300" | ||||||
|             [priority]="300" [content]="'addon.mod_forum.unlockdiscussion' | translate" iconAction="fas-unlock" |             [content]="'addon.mod_forum.unlockdiscussion' | translate" iconAction="fas-unlock" (action)="setLockState(false)"> | ||||||
|             (action)="setLockState(false)"> |  | ||||||
|         </core-context-menu-item> |         </core-context-menu-item> | ||||||
|         <core-context-menu-item [hidden]="!discussion || !canPin || discussion.pinned" |         <core-context-menu-item [hidden]="!discussion || !canPin || discussion.pinned" [priority]="250" | ||||||
|             [priority]="250" [content]="'addon.mod_forum.pindiscussion' | translate" iconAction="fas-map-pin" |             [content]="'addon.mod_forum.pindiscussion' | translate" iconAction="fas-map-pin" (action)="setPinState(true)"> | ||||||
|             (action)="setPinState(true)"> |  | ||||||
|         </core-context-menu-item> |         </core-context-menu-item> | ||||||
|         <core-context-menu-item [hidden]="!discussion || !canPin || !discussion.pinned" |         <core-context-menu-item [hidden]="!discussion || !canPin || !discussion.pinned" [priority]="250" | ||||||
|             [priority]="250" [content]="'addon.mod_forum.unpindiscussion' | translate" [iconSlash]="true" iconAction="fas-map-pin" |             [content]="'addon.mod_forum.unpindiscussion' | translate" [iconSlash]="true" iconAction="fas-map-pin" | ||||||
|             (action)="setPinState(false)"> |             (action)="setPinState(false)"> | ||||||
|         </core-context-menu-item> |         </core-context-menu-item> | ||||||
|         <core-context-menu-item [hidden]="!discussion || !discussion.canfavourite || discussion.starred" |         <core-context-menu-item [hidden]="!discussion || !discussion.canfavourite || discussion.starred" [priority]="200" | ||||||
|             [priority]="200" [content]="'addon.mod_forum.addtofavourites' | translate" iconAction="fas-star" |             [content]="'addon.mod_forum.addtofavourites' | translate" iconAction="fas-star" (action)="toggleFavouriteState(true)"> | ||||||
|             (action)="toggleFavouriteState(true)"> |  | ||||||
|         </core-context-menu-item> |         </core-context-menu-item> | ||||||
|         <core-context-menu-item [hidden]="!discussion || !discussion.canfavourite || !discussion.starred" |         <core-context-menu-item [hidden]="!discussion || !discussion.canfavourite || !discussion.starred" [priority]="200" | ||||||
|             [priority]="200" [content]="'addon.mod_forum.removefromfavourites' | translate" iconAction="fas-star" [iconSlash]="true" |             [content]="'addon.mod_forum.removefromfavourites' | translate" iconAction="fas-star" [iconSlash]="true" | ||||||
|             (action)="toggleFavouriteState(false)"> |             (action)="toggleFavouriteState(false)"> | ||||||
|         </core-context-menu-item> |         </core-context-menu-item> | ||||||
|     </core-context-menu> |     </core-context-menu> | ||||||
| @ -90,25 +85,20 @@ | |||||||
|         </ion-card> |         </ion-card> | ||||||
| 
 | 
 | ||||||
|         <div *ngIf="startingPost" class="ion-margin-bottom"> |         <div *ngIf="startingPost" class="ion-margin-bottom"> | ||||||
|             <addon-mod-forum-post |             <addon-mod-forum-post [post]="startingPost" [discussion]="discussion" [courseId]="courseId" [highlight]="true" | ||||||
|                 [post]="startingPost" [discussion]="discussion" [courseId]="courseId" [highlight]="true" |                 [discussionId]="discussionId" [component]="component" [componentId]="cmId" [formData]="formData" | ||||||
|                 [discussionId]="discussionId" [component]="component" [componentId]="cmId" |                 [originalData]="originalData" [forum]="forum" [accessInfo]="accessInfo" [trackPosts]="trackPosts" [ratingInfo]="ratingInfo" | ||||||
|                 [formData]="formData" [originalData]="originalData" [forum]="forum" [accessInfo]="accessInfo" |                 [leavingPage]="leavingPage" (onPostChange)="postListChanged()"> | ||||||
|                 [trackPosts]="trackPosts" [ratingInfo]="ratingInfo" [leavingPage]="leavingPage" |  | ||||||
|                 (onPostChange)="postListChanged()"> |  | ||||||
|             </addon-mod-forum-post> |             </addon-mod-forum-post> | ||||||
|         </div> |         </div> | ||||||
| 
 | 
 | ||||||
|         <ion-card *ngIf="sort != 'nested'"> |         <ion-card *ngIf="sort != 'nested'"> | ||||||
|             <ng-container *ngFor="let post of posts; first as first"> |             <ng-container *ngFor="let post of posts; first as first"> | ||||||
|                 <core-spacer *ngIf="!first"></core-spacer> |                 <core-spacer *ngIf="!first"></core-spacer> | ||||||
|                 <addon-mod-forum-post |                 <addon-mod-forum-post [post]="post" [courseId]="courseId" [discussionId]="discussionId" [component]="component" | ||||||
|                     [post]="post" [courseId]="courseId" [discussionId]="discussionId" |                     [componentId]="cmId" [formData]="formData" [originalData]="originalData" [parentSubject]="postSubjects[post.parentid]" | ||||||
|                     [component]="component" [componentId]="cmId" [formData]="formData" |  | ||||||
|                     [originalData]="originalData" [parentSubject]="postSubjects[post.parentid]" |  | ||||||
|                     [forum]="forum" [accessInfo]="accessInfo" [trackPosts]="trackPosts" [ratingInfo]="ratingInfo" |                     [forum]="forum" [accessInfo]="accessInfo" [trackPosts]="trackPosts" [ratingInfo]="ratingInfo" | ||||||
|                     [leavingPage]="leavingPage" |                     [leavingPage]="leavingPage" (onPostChange)="postListChanged()"> | ||||||
|                     (onPostChange)="postListChanged()"> |  | ||||||
|                 </addon-mod-forum-post> |                 </addon-mod-forum-post> | ||||||
|             </ng-container> |             </ng-container> | ||||||
|         </ion-card> |         </ion-card> | ||||||
| @ -121,12 +111,10 @@ | |||||||
| 
 | 
 | ||||||
|         <ng-template #nestedPosts let-post="post"> |         <ng-template #nestedPosts let-post="post"> | ||||||
|             <ion-card> |             <ion-card> | ||||||
|                 <addon-mod-forum-post |                 <addon-mod-forum-post [post]="post" [courseId]="courseId" [discussionId]="discussionId" [component]="component" | ||||||
|                     [post]="post" [courseId]="courseId" [discussionId]="discussionId" [component]="component" |                     [componentId]="cmId" [formData]="formData" [originalData]="originalData" [parentSubject]="postSubjects[post.parentid]" | ||||||
|                     [componentId]="cmId" [formData]="formData" [originalData]="originalData" |                     [forum]="forum" [accessInfo]="accessInfo" [trackPosts]="trackPosts" [ratingInfo]="ratingInfo" | ||||||
|                     [parentSubject]="postSubjects[post.parentid]" [forum]="forum" [accessInfo]="accessInfo" |                     [leavingPage]="leavingPage" (onPostChange)="postListChanged()"> | ||||||
|                     [trackPosts]="trackPosts" [ratingInfo]="ratingInfo" [leavingPage]="leavingPage" |  | ||||||
|                     (onPostChange)="postListChanged()"> |  | ||||||
|                 </addon-mod-forum-post> |                 </addon-mod-forum-post> | ||||||
|             </ion-card> |             </ion-card> | ||||||
|             <div class="ion-padding-start" *ngIf="post.children && post.children.length && post.children[0].subject"> |             <div class="ion-padding-start" *ngIf="post.children && post.children.length && post.children[0].subject"> | ||||||
|  | |||||||
| @ -3,10 +3,12 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1> |             <h1> | ||||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId"> |                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId"> | ||||||
|                 </core-format-text> |                 </core-format-text> | ||||||
|             </h1> |             </h1> | ||||||
|  |         </ion-title> | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <!-- The buttons defined by the component will be added in here. --> |             <!-- The buttons defined by the component will be added in here. --> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  | |||||||
| @ -3,7 +3,9 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1>{{ 'addon.mod_forum.addanewdiscussion' | translate }}</h1> |             <h1>{{ 'addon.mod_forum.addanewdiscussion' | translate }}</h1> | ||||||
|  |         </ion-title> | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <!-- The context menu will be added in here. --> |             <!-- The context menu will be added in here. --> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
| @ -18,9 +20,8 @@ | |||||||
|         <form *ngIf="showForm" #newDiscFormEl> |         <form *ngIf="showForm" #newDiscFormEl> | ||||||
|             <ion-item> |             <ion-item> | ||||||
|                 <ion-label position="stacked">{{ 'addon.mod_forum.subject' | translate }}</ion-label> |                 <ion-label position="stacked">{{ 'addon.mod_forum.subject' | translate }}</ion-label> | ||||||
|                 <ion-input |                 <ion-input [(ngModel)]="newDiscussion.subject" type="text" [placeholder]="'addon.mod_forum.subject' | translate" | ||||||
|                     [(ngModel)]="newDiscussion.subject" |                     name="subject"> | ||||||
|                     type="text" [placeholder]="'addon.mod_forum.subject' | translate" name="subject"> |  | ||||||
|                 </ion-input> |                 </ion-input> | ||||||
|             </ion-item> |             </ion-item> | ||||||
|             <ion-item> |             <ion-item> | ||||||
| @ -31,19 +32,14 @@ | |||||||
|                     (contentChanged)="onMessageChange($event)"> |                     (contentChanged)="onMessageChange($event)"> | ||||||
|                 </core-rich-text-editor> |                 </core-rich-text-editor> | ||||||
|             </ion-item> |             </ion-item> | ||||||
|             <ion-item |             <ion-item button class="divider ion-text-wrap" (click)="toggleAdvanced()" detail="false" [attr.aria-expanded]="advanced" | ||||||
|                 button |                 [attr.aria-label]="(advanced ? 'core.hideadvanced' : 'core.showadvanced') | translate" role="heading" | ||||||
|                 class="divider ion-text-wrap" |                 aria-controls="addon-mod-forum-new-discussion-advanced"> | ||||||
|                 (click)="toggleAdvanced()" |  | ||||||
|                 detail="false" |  | ||||||
|                 [attr.aria-expanded]="advanced" |  | ||||||
|                 [attr.aria-label]="(advanced ? 'core.hideadvanced' : 'core.showadvanced') | translate" |  | ||||||
|                 role="heading" |  | ||||||
|                 aria-controls="addon-mod-forum-new-discussion-advanced" |  | ||||||
|             > |  | ||||||
|                 <ion-icon *ngIf="!advanced" name="fas-caret-right" flip-rtl slot="start" aria-hidden="true"></ion-icon> |                 <ion-icon *ngIf="!advanced" name="fas-caret-right" flip-rtl slot="start" aria-hidden="true"></ion-icon> | ||||||
|                 <ion-icon *ngIf="advanced" name="fas-caret-down" slot="start" aria-hidden="true"></ion-icon> |                 <ion-icon *ngIf="advanced" name="fas-caret-down" slot="start" aria-hidden="true"></ion-icon> | ||||||
|                 <ion-label><h2>{{ 'addon.mod_forum.advanced' | translate }}</h2></ion-label> |                 <ion-label> | ||||||
|  |                     <h2>{{ 'addon.mod_forum.advanced' | translate }}</h2> | ||||||
|  |                 </ion-label> | ||||||
|             </ion-item> |             </ion-item> | ||||||
|             <div *ngIf="advanced" id="addon-mod-forum-new-discussion-advanced"> |             <div *ngIf="advanced" id="addon-mod-forum-new-discussion-advanced"> | ||||||
|                 <ion-item *ngIf="showGroups && groupIds.length > 1 && accessInfo.cancanposttomygroups"> |                 <ion-item *ngIf="showGroups && groupIds.length > 1 && accessInfo.cancanposttomygroups"> | ||||||
| @ -66,17 +62,16 @@ | |||||||
|                     <ion-label>{{ 'addon.mod_forum.discussionpinned' | translate }}</ion-label> |                     <ion-label>{{ 'addon.mod_forum.discussionpinned' | translate }}</ion-label> | ||||||
|                     <ion-toggle [(ngModel)]="newDiscussion.pin" name="pin"></ion-toggle> |                     <ion-toggle [(ngModel)]="newDiscussion.pin" name="pin"></ion-toggle> | ||||||
|                 </ion-item> |                 </ion-item> | ||||||
|                 <core-attachments *ngIf="canCreateAttachments && forum && forum.maxattachments > 0" |                 <core-attachments *ngIf="canCreateAttachments && forum && forum.maxattachments > 0" [files]="newDiscussion.files" | ||||||
|                     [files]="newDiscussion.files" [maxSize]="forum.maxbytes" [maxSubmissions]="forum.maxattachments" |                     [maxSize]="forum.maxbytes" [maxSubmissions]="forum.maxattachments" [component]="component" [componentId]="forum.cmid" | ||||||
|                     [component]="component" [componentId]="forum.cmid" [allowOffline]="true" [courseId]="courseId"> |                     [allowOffline]="true" [courseId]="courseId"> | ||||||
|                 </core-attachments> |                 </core-attachments> | ||||||
|             </div> |             </div> | ||||||
|             <ion-item> |             <ion-item> | ||||||
|                 <ion-label> |                 <ion-label> | ||||||
|                     <ion-row> |                     <ion-row> | ||||||
|                         <ion-col> |                         <ion-col> | ||||||
|                             <ion-button |                             <ion-button expand="block" [disabled]="newDiscussion.subject == '' || newDiscussion.message == null" | ||||||
|                                 expand="block" [disabled]="newDiscussion.subject == '' || newDiscussion.message == null" |  | ||||||
|                                 (click)="add()"> |                                 (click)="add()"> | ||||||
|                                 {{ 'addon.mod_forum.posttoforum' | translate }} |                                 {{ 'addon.mod_forum.posttoforum' | translate }} | ||||||
|                             </ion-button> |                             </ion-button> | ||||||
|  | |||||||
| @ -3,10 +3,12 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1 *ngIf="glossary"> |             <h1 *ngIf="glossary"> | ||||||
|                 <core-format-text [text]="glossary.name" contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId"> |                 <core-format-text [text]="glossary.name" contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId"> | ||||||
|                 </core-format-text> |                 </core-format-text> | ||||||
|             </h1> |             </h1> | ||||||
|  |         </ion-title> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content> | ||||||
| @ -14,16 +16,15 @@ | |||||||
|         <form #editFormEl *ngIf="glossary"> |         <form #editFormEl *ngIf="glossary"> | ||||||
|             <ion-item> |             <ion-item> | ||||||
|                 <ion-label position="stacked">{{ 'addon.mod_glossary.concept' | translate }}</ion-label> |                 <ion-label position="stacked">{{ 'addon.mod_glossary.concept' | translate }}</ion-label> | ||||||
|                 <ion-input type="text" [placeholder]="'addon.mod_glossary.concept' | translate" [(ngModel)]="entry.concept" |                 <ion-input type="text" [placeholder]="'addon.mod_glossary.concept' | translate" [(ngModel)]="entry.concept" name="concept"> | ||||||
|                     name="concept"> |  | ||||||
|                 </ion-input> |                 </ion-input> | ||||||
|             </ion-item> |             </ion-item> | ||||||
|             <ion-item> |             <ion-item> | ||||||
|                 <ion-label position="stacked">{{ 'addon.mod_glossary.definition' | translate }}</ion-label> |                 <ion-label position="stacked">{{ 'addon.mod_glossary.definition' | translate }}</ion-label> | ||||||
|                 <core-rich-text-editor [control]="definitionControl" (contentChanged)="onDefinitionChange($event)" |                 <core-rich-text-editor [control]="definitionControl" (contentChanged)="onDefinitionChange($event)" | ||||||
|                     [placeholder]="'addon.mod_glossary.definition' | translate" name="addon_mod_glossary_edit" |                     [placeholder]="'addon.mod_glossary.definition' | translate" name="addon_mod_glossary_edit" [component]="component" | ||||||
|                     [component]="component" [componentId]="cmId" [autoSave]="true" contextLevel="module" |                     [componentId]="cmId" [autoSave]="true" contextLevel="module" [contextInstanceId]="cmId" elementId="definition_editor" | ||||||
|                     [contextInstanceId]="cmId" elementId="definition_editor" [draftExtraParams]="editorExtraParams"> |                     [draftExtraParams]="editorExtraParams"> | ||||||
|                 </core-rich-text-editor> |                 </core-rich-text-editor> | ||||||
|             </ion-item> |             </ion-item> | ||||||
|             <ion-item *ngIf="categories.length > 0"> |             <ion-item *ngIf="categories.length > 0"> | ||||||
| @ -47,14 +48,18 @@ | |||||||
|                 </ion-textarea> |                 </ion-textarea> | ||||||
|             </ion-item> |             </ion-item> | ||||||
|             <ion-item-divider> |             <ion-item-divider> | ||||||
|                 <ion-label><h2>{{ 'addon.mod_glossary.attachment' | translate }}</h2></ion-label> |                 <ion-label> | ||||||
|  |                     <h2>{{ 'addon.mod_glossary.attachment' | translate }}</h2> | ||||||
|  |                 </ion-label> | ||||||
|             </ion-item-divider> |             </ion-item-divider> | ||||||
|             <core-attachments [files]="attachments" [component]="component" [componentId]="glossary.coursemodule" |             <core-attachments [files]="attachments" [component]="component" [componentId]="glossary.coursemodule" [allowOffline]="true" | ||||||
|                 [allowOffline]="true" [courseId]="courseId"> |                 [courseId]="courseId"> | ||||||
|             </core-attachments> |             </core-attachments> | ||||||
|             <ng-container *ngIf="glossary.usedynalink"> |             <ng-container *ngIf="glossary.usedynalink"> | ||||||
|                 <ion-item-divider> |                 <ion-item-divider> | ||||||
|                     <ion-label><h2>{{ 'addon.mod_glossary.linking' | translate }}</h2></ion-label> |                     <ion-label> | ||||||
|  |                         <h2>{{ 'addon.mod_glossary.linking' | translate }}</h2> | ||||||
|  |                     </ion-label> | ||||||
|                 </ion-item-divider> |                 </ion-item-divider> | ||||||
|                 <ion-item class="ion-text-wrap"> |                 <ion-item class="ion-text-wrap"> | ||||||
|                     <ion-label>{{ 'addon.mod_glossary.entryusedynalink' | translate }}</ion-label> |                     <ion-label>{{ 'addon.mod_glossary.entryusedynalink' | translate }}</ion-label> | ||||||
|  | |||||||
| @ -3,10 +3,12 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1 *ngIf="entry"> |             <h1 *ngIf="entry"> | ||||||
|                 <core-format-text [text]="entry.concept" contextLevel="module" [contextInstanceId]="componentId" [courseId]="courseId"> |                 <core-format-text [text]="entry.concept" contextLevel="module" [contextInstanceId]="componentId" [courseId]="courseId"> | ||||||
|                 </core-format-text> |                 </core-format-text> | ||||||
|             </h1> |             </h1> | ||||||
|  |         </ion-title> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content> | ||||||
| @ -39,14 +41,13 @@ | |||||||
|             </ion-item> |             </ion-item> | ||||||
|             <ion-item class="ion-text-wrap"> |             <ion-item class="ion-text-wrap"> | ||||||
|                 <ion-label> |                 <ion-label> | ||||||
|                     <core-format-text [component]="component" [componentId]="componentId" [text]="entry.definition" |                     <core-format-text [component]="component" [componentId]="componentId" [text]="entry.definition" contextLevel="module" | ||||||
|                         contextLevel="module" [contextInstanceId]="componentId" [courseId]="courseId"> |                         [contextInstanceId]="componentId" [courseId]="courseId"> | ||||||
|                     </core-format-text> |                     </core-format-text> | ||||||
|                 </ion-label> |                 </ion-label> | ||||||
|             </ion-item> |             </ion-item> | ||||||
|             <div *ngIf="entry.attachment" lines="none"> |             <div *ngIf="entry.attachment" lines="none"> | ||||||
|                 <core-file *ngFor="let file of entry.attachments" [file]="file" [component]="component" |                 <core-file *ngFor="let file of entry.attachments" [file]="file" [component]="component" [componentId]="componentId"> | ||||||
|                     [componentId]="componentId"> |  | ||||||
|                 </core-file> |                 </core-file> | ||||||
|             </div> |             </div> | ||||||
|             <ion-item class="ion-text-wrap" *ngIf="tagsEnabled && entry && entry.tags && entry.tags.length > 0"> |             <ion-item class="ion-text-wrap" *ngIf="tagsEnabled && entry && entry.tags && entry.tags.length > 0"> | ||||||
| @ -56,20 +57,21 @@ | |||||||
|                 </ion-label> |                 </ion-label> | ||||||
|             </ion-item> |             </ion-item> | ||||||
|             <ion-item class="ion-text-wrap" *ngIf="!entry.approved"> |             <ion-item class="ion-text-wrap" *ngIf="!entry.approved"> | ||||||
|                 <ion-label><p><em>{{ 'addon.mod_glossary.entrypendingapproval' | translate }}</em></p></ion-label> |                 <ion-label> | ||||||
|  |                     <p><em>{{ 'addon.mod_glossary.entrypendingapproval' | translate }}</em></p> | ||||||
|  |                 </ion-label> | ||||||
|             </ion-item> |             </ion-item> | ||||||
|             <core-comments *ngIf="glossary && glossary.allowcomments && entry && entry.id > 0 && commentsEnabled" |             <core-comments *ngIf="glossary && glossary.allowcomments && entry && entry.id > 0 && commentsEnabled" contextLevel="module" | ||||||
|                 contextLevel="module" [instanceId]="glossary.coursemodule" component="mod_glossary" |                 [instanceId]="glossary.coursemodule" component="mod_glossary" [itemId]="entry.id" area="glossary_entry" | ||||||
|                 [itemId]="entry.id" area="glossary_entry" [courseId]="glossary.course" [showItem]="true"> |                 [courseId]="glossary.course" [showItem]="true"> | ||||||
|             </core-comments> |             </core-comments> | ||||||
|             <core-rating-rate *ngIf="glossary && ratingInfo" [ratingInfo]="ratingInfo" contextLevel="module" |             <core-rating-rate *ngIf="glossary && ratingInfo" [ratingInfo]="ratingInfo" contextLevel="module" | ||||||
|                 [instanceId]="glossary.coursemodule" [itemId]="entry.id" [itemSetId]="0" [courseId]="glossary.course" |                 [instanceId]="glossary.coursemodule" [itemId]="entry.id" [itemSetId]="0" [courseId]="glossary.course" | ||||||
|                 [aggregateMethod]="glossary.assessed" [scaleId]="glossary.scale" [userId]="entry.userid" |                 [aggregateMethod]="glossary.assessed" [scaleId]="glossary.scale" [userId]="entry.userid" (onUpdate)="ratingUpdated()"> | ||||||
|                 (onUpdate)="ratingUpdated()"> |  | ||||||
|             </core-rating-rate> |             </core-rating-rate> | ||||||
|             <core-rating-aggregate *ngIf="glossary && ratingInfo" [ratingInfo]="ratingInfo" contextLevel="module" |             <core-rating-aggregate *ngIf="glossary && ratingInfo" [ratingInfo]="ratingInfo" contextLevel="module" | ||||||
|                 [instanceId]="glossary.coursemodule" [itemId]="entry.id" [courseId]="glossary.course" |                 [instanceId]="glossary.coursemodule" [itemId]="entry.id" [courseId]="glossary.course" [aggregateMethod]="glossary.assessed" | ||||||
|                 [aggregateMethod]="glossary.assessed" [scaleId]="glossary.scale"> |                 [scaleId]="glossary.scale"> | ||||||
|             </core-rating-aggregate> |             </core-rating-aggregate> | ||||||
|         </ng-container> |         </ng-container> | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -3,10 +3,12 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1> |             <h1> | ||||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> |                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> | ||||||
|                 </core-format-text> |                 </core-format-text> | ||||||
|             </h1> |             </h1> | ||||||
|  |         </ion-title> | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <!-- The buttons defined by the component will be added in here. --> |             <!-- The buttons defined by the component will be added in here. --> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  | |||||||
| @ -3,11 +3,13 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1> |             <h1> | ||||||
|                 <core-format-text *ngIf="h5pActivity" [text]="h5pActivity.name" contextLevel="module" |                 <core-format-text *ngIf="h5pActivity" [text]="h5pActivity.name" contextLevel="module" | ||||||
|                     [contextInstanceId]="h5pActivity.coursemodule" [courseId]="courseId"> |                     [contextInstanceId]="h5pActivity.coursemodule" [courseId]="courseId"> | ||||||
|                 </core-format-text> |                 </core-format-text> | ||||||
|             </h1> |             </h1> | ||||||
|  |         </ion-title> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content> | ||||||
| @ -62,15 +64,15 @@ | |||||||
|                     <ion-item class="ion-text-wrap" lines="none"> |                     <ion-item class="ion-text-wrap" lines="none"> | ||||||
|                         <ion-label> |                         <ion-label> | ||||||
|                             <h2>{{ 'addon.mod_h5pactivity.outcome' | translate }}</h2> |                             <h2>{{ 'addon.mod_h5pactivity.outcome' | translate }}</h2> | ||||||
|                             <p *ngIf="attempt.success !== null && attempt.success" > |                             <p *ngIf="attempt.success !== null && attempt.success"> | ||||||
|                                 <ion-icon name="fas-check-circle" aria-hidden="true"></ion-icon> |                                 <ion-icon name="fas-check-circle" aria-hidden="true"></ion-icon> | ||||||
|                                 {{ 'addon.mod_h5pactivity.attempt_success_pass' | translate }} |                                 {{ 'addon.mod_h5pactivity.attempt_success_pass' | translate }} | ||||||
|                             </p> |                             </p> | ||||||
|                             <p *ngIf="attempt.success !== null && !attempt.success" > |                             <p *ngIf="attempt.success !== null && !attempt.success"> | ||||||
|                                 <ion-icon name="far-circle" aria-hidden="true"></ion-icon> |                                 <ion-icon name="far-circle" aria-hidden="true"></ion-icon> | ||||||
|                                 {{ 'addon.mod_h5pactivity.attempt_success_fail' | translate }} |                                 {{ 'addon.mod_h5pactivity.attempt_success_fail' | translate }} | ||||||
|                             </p> |                             </p> | ||||||
|                             <p *ngIf="attempt.success === null" > |                             <p *ngIf="attempt.success === null"> | ||||||
|                                 {{ 'addon.mod_h5pactivity.attempt_success_unknown' | translate }} |                                 {{ 'addon.mod_h5pactivity.attempt_success_unknown' | translate }} | ||||||
|                             </p> |                             </p> | ||||||
|                         </ion-label> |                         </ion-label> | ||||||
| @ -89,15 +91,15 @@ | |||||||
|                 <ion-card *ngFor="let result of attempt.results"> |                 <ion-card *ngFor="let result of attempt.results"> | ||||||
|                     <ion-card-header class="ion-text-wrap"> |                     <ion-card-header class="ion-text-wrap"> | ||||||
|                         <ion-card-title> |                         <ion-card-title> | ||||||
|                             <core-format-text [text]="result.description" [component]="component" [componentId]="cmId" |                             <core-format-text [text]="result.description" [component]="component" [componentId]="cmId" contextLevel="module" | ||||||
|                                 contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId"> |                                 [contextInstanceId]="cmId" [courseId]="courseId"> | ||||||
|                             </core-format-text> |                             </core-format-text> | ||||||
|                         </ion-card-title> |                         </ion-card-title> | ||||||
|                     </ion-card-header> |                     </ion-card-header> | ||||||
|                     <ion-item *ngIf="result.content" class="ion-text-wrap"> |                     <ion-item *ngIf="result.content" class="ion-text-wrap"> | ||||||
|                         <ion-label> |                         <ion-label> | ||||||
|                             <core-format-text [text]="result.content" [component]="component" [componentId]="cmId" |                             <core-format-text [text]="result.content" [component]="component" [componentId]="cmId" contextLevel="module" | ||||||
|                                 contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId"> |                                 [contextInstanceId]="cmId" [courseId]="courseId"> | ||||||
|                             </core-format-text> |                             </core-format-text> | ||||||
|                         </ion-label> |                         </ion-label> | ||||||
|                     </ion-item> |                     </ion-item> | ||||||
| @ -113,8 +115,7 @@ | |||||||
|                                 </ion-row> |                                 </ion-row> | ||||||
|                             </ion-label> |                             </ion-label> | ||||||
|                         </ion-item> |                         </ion-item> | ||||||
|                         <ion-item *ngFor="let option of result.options" |                         <ion-item *ngFor="let option of result.options" class="ion-text-wrap addon-mod_h5pactivity-result-table-row"> | ||||||
|                             class="ion-text-wrap addon-mod_h5pactivity-result-table-row"> |  | ||||||
|                             <ion-label> |                             <ion-label> | ||||||
|                                 <ion-row class="ion-align-items-center"> |                                 <ion-row class="ion-align-items-center"> | ||||||
|                                     <ion-col class="ion-text-center"> |                                     <ion-col class="ion-text-center"> | ||||||
| @ -124,8 +125,7 @@ | |||||||
|                                     </ion-col> |                                     </ion-col> | ||||||
|                                     <ion-col class="ion-text-center"> |                                     <ion-col class="ion-text-center"> | ||||||
|                                         <ng-container *ngIf="option.correctanswer"> |                                         <ng-container *ngIf="option.correctanswer"> | ||||||
|                                             <ng-container |                                             <ng-container *ngTemplateOutlet="answerTemplate; context: {answer: option.correctanswer}"> | ||||||
|                                                 *ngTemplateOutlet="answerTemplate; context: {answer: option.correctanswer}"> |  | ||||||
|                                             </ng-container> |                                             </ng-container> | ||||||
|                                         </ng-container> |                                         </ng-container> | ||||||
|                                     </ion-col> |                                     </ion-col> | ||||||
|  | |||||||
| @ -3,10 +3,12 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1> |             <h1> | ||||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId"> |                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId"> | ||||||
|                 </core-format-text> |                 </core-format-text> | ||||||
|             </h1> |             </h1> | ||||||
|  |         </ion-title> | ||||||
| 
 | 
 | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <!-- The buttons defined by the component will be added in here. --> |             <!-- The buttons defined by the component will be added in here. --> | ||||||
|  | |||||||
| @ -3,11 +3,13 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1> |             <h1> | ||||||
|                 <core-format-text *ngIf="h5pActivity" [text]="h5pActivity.name" contextLevel="module" |                 <core-format-text *ngIf="h5pActivity" [text]="h5pActivity.name" contextLevel="module" | ||||||
|                     [contextInstanceId]="h5pActivity.coursemodule" [courseId]="courseId"> |                     [contextInstanceId]="h5pActivity.coursemodule" [courseId]="courseId"> | ||||||
|                 </core-format-text> |                 </core-format-text> | ||||||
|             </h1> |             </h1> | ||||||
|  |         </ion-title> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content> | ||||||
|  | |||||||
| @ -3,11 +3,13 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1> |             <h1> | ||||||
|                 <core-format-text *ngIf="h5pActivity" [text]="h5pActivity.name" contextLevel="module" |                 <core-format-text *ngIf="h5pActivity" [text]="h5pActivity.name" contextLevel="module" | ||||||
|                     [contextInstanceId]="h5pActivity.coursemodule" [courseId]="courseId"> |                     [contextInstanceId]="h5pActivity.coursemodule" [courseId]="courseId"> | ||||||
|                 </core-format-text> |                 </core-format-text> | ||||||
|             </h1> |             </h1> | ||||||
|  |         </ion-title> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content> | ||||||
|  | |||||||
| @ -1,6 +1,8 @@ | |||||||
| <ion-header> | <ion-header> | ||||||
|     <ion-toolbar> |     <ion-toolbar> | ||||||
|         <h1>{{ 'addon.mod_imscp.toc' | translate }}</h1> |         <ion-title> | ||||||
|  |             <h2>{{ 'addon.mod_imscp.toc' | translate }}</h2> | ||||||
|  |         </ion-title> | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate"> |             <ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate"> | ||||||
|                 <ion-icon name="fas-times" slot="icon-only" aria-hidden=true></ion-icon> |                 <ion-icon name="fas-times" slot="icon-only" aria-hidden=true></ion-icon> | ||||||
|  | |||||||
| @ -3,10 +3,12 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1> |             <h1> | ||||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> |                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> | ||||||
|                 </core-format-text> |                 </core-format-text> | ||||||
|             </h1> |             </h1> | ||||||
|  |         </ion-title> | ||||||
| 
 | 
 | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <!-- The buttons defined by the component will be added in here. --> |             <!-- The buttons defined by the component will be added in here. --> | ||||||
|  | |||||||
| @ -1,7 +1,8 @@ | |||||||
| <ion-header> | <ion-header> | ||||||
|     <ion-toolbar> |     <ion-toolbar> | ||||||
|  |         <ion-title> | ||||||
|             <h2>{{ pageInstance?.lesson?.name }}</h2> |             <h2>{{ pageInstance?.lesson?.name }}</h2> | ||||||
| 
 |         </ion-title> | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate"> |             <ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate"> | ||||||
|                 <ion-icon slot="icon-only" name="fas-times" aria-hidden="true"></ion-icon> |                 <ion-icon slot="icon-only" name="fas-times" aria-hidden="true"></ion-icon> | ||||||
| @ -15,7 +16,9 @@ | |||||||
|             <!-- Media file. --> |             <!-- Media file. --> | ||||||
|             <ng-container *ngIf="pageInstance.mediaFile"> |             <ng-container *ngIf="pageInstance.mediaFile"> | ||||||
|                 <ion-item-divider> |                 <ion-item-divider> | ||||||
|                     <ion-label><h2>{{ 'addon.mod_lesson.linkedmedia' | translate }}</h2></ion-label> |                     <ion-label> | ||||||
|  |                         <h2>{{ 'addon.mod_lesson.linkedmedia' | translate }}</h2> | ||||||
|  |                     </ion-label> | ||||||
|                 </ion-item-divider> |                 </ion-item-divider> | ||||||
|                 <core-file [file]="pageInstance.mediaFile" [component]="pageInstance.component" |                 <core-file [file]="pageInstance.mediaFile" [component]="pageInstance.component" | ||||||
|                     [componentId]="pageInstance.lesson?.coursemodule"> |                     [componentId]="pageInstance.lesson?.coursemodule"> | ||||||
| @ -25,16 +28,20 @@ | |||||||
|             <!-- Lesson menu. --> |             <!-- Lesson menu. --> | ||||||
|             <ng-container *ngIf="pageInstance.displayMenu"> |             <ng-container *ngIf="pageInstance.displayMenu"> | ||||||
|                 <ion-item-divider> |                 <ion-item-divider> | ||||||
|                     <ion-label><h2>{{ 'addon.mod_lesson.lessonmenu' | translate }}</h2></ion-label> |                     <ion-label> | ||||||
|  |                         <h2>{{ 'addon.mod_lesson.lessonmenu' | translate }}</h2> | ||||||
|  |                     </ion-label> | ||||||
|                 </ion-item-divider> |                 </ion-item-divider> | ||||||
|                 <ion-item class="ion-text-center" *ngIf="pageInstance.loadingMenu"> |                 <ion-item class="ion-text-center" *ngIf="pageInstance.loadingMenu"> | ||||||
|                     <ion-label><ion-spinner [attr.aria-label]="'core.loading' | translate"></ion-spinner></ion-label> |                     <ion-label> | ||||||
|  |                         <ion-spinner [attr.aria-label]="'core.loading' | translate"></ion-spinner> | ||||||
|  |                     </ion-label> | ||||||
|                 </ion-item> |                 </ion-item> | ||||||
|                 <div *ngIf="!pageInstance.loadingMenu"> |                 <div *ngIf="!pageInstance.loadingMenu"> | ||||||
|                     <ng-container *ngFor="let page of pageInstance.lessonPages"> |                     <ng-container *ngFor="let page of pageInstance.lessonPages"> | ||||||
|                         <ion-item class="ion-text-wrap" *ngIf="page.display && page.displayinmenublock" (click)="loadPage(page.id)" |                         <ion-item class="ion-text-wrap" *ngIf="page.display && page.displayinmenublock" (click)="loadPage(page.id)" | ||||||
|                             [attr.aria-current]="!pageInstance.eolData && pageInstance.currentPage == page.id ? 'page' : 'false'" |                             [attr.aria-current]="!pageInstance.eolData && pageInstance.currentPage == page.id ? 'page' : 'false'" button | ||||||
|                             button detail="true"> |                             detail="true"> | ||||||
|                             <ion-label> |                             <ion-label> | ||||||
|                                 <core-format-text [text]="page.title" contextLevel="module" [courseId]="pageInstance.courseId" |                                 <core-format-text [text]="page.title" contextLevel="module" [courseId]="pageInstance.courseId" | ||||||
|                                     [contextInstanceId]="pageInstance.lesson?.coursemodule"> |                                     [contextInstanceId]="pageInstance.lesson?.coursemodule"> | ||||||
|  | |||||||
| @ -1,7 +1,8 @@ | |||||||
| <ion-header> | <ion-header> | ||||||
|     <ion-toolbar> |     <ion-toolbar> | ||||||
|  |         <ion-title> | ||||||
|             <h2>{{ 'core.login.password' | translate }}</h2> |             <h2>{{ 'core.login.password' | translate }}</h2> | ||||||
| 
 |         </ion-title> | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate"> |             <ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate"> | ||||||
|                 <ion-icon slot="icon-only" name="fas-times" aria-hidden="true"></ion-icon> |                 <ion-icon slot="icon-only" name="fas-times" aria-hidden="true"></ion-icon> | ||||||
| @ -14,8 +15,8 @@ | |||||||
|         <ion-item> |         <ion-item> | ||||||
|             <ion-label>{{ 'addon.mod_lesson.enterpassword' | translate }}</ion-label> |             <ion-label>{{ 'addon.mod_lesson.enterpassword' | translate }}</ion-label> | ||||||
|             <core-show-password name="password"> |             <core-show-password name="password"> | ||||||
|                 <ion-input name="password" type="password" placeholder="{{ 'core.login.password' | translate }}" |                 <ion-input name="password" type="password" placeholder="{{ 'core.login.password' | translate }}" core-auto-focus | ||||||
|                     core-auto-focus #passwordinput [clearOnEdit]="false"> |                     #passwordinput [clearOnEdit]="false"> | ||||||
|                 </ion-input> |                 </ion-input> | ||||||
|             </core-show-password> |             </core-show-password> | ||||||
|         </ion-item> |         </ion-item> | ||||||
|  | |||||||
| @ -3,10 +3,12 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1> |             <h1> | ||||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> |                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> | ||||||
|                 </core-format-text> |                 </core-format-text> | ||||||
|             </h1> |             </h1> | ||||||
|  |         </ion-title> | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <!-- The buttons defined by the component will be added in here. --> |             <!-- The buttons defined by the component will be added in here. --> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  | |||||||
| @ -3,11 +3,12 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1> |             <h1> | ||||||
|             <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="lesson?.coursemodule" |                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="lesson?.coursemodule" [courseId]="courseId"> | ||||||
|                 [courseId]="courseId"> |  | ||||||
|                 </core-format-text> |                 </core-format-text> | ||||||
|             </h1> |             </h1> | ||||||
|  |         </ion-title> | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <ion-button fill="clear" *ngIf="displayMenu || mediaFile" [attr.aria-label]="'addon.mod_lesson.lessonmenu' | translate" |             <ion-button fill="clear" *ngIf="displayMenu || mediaFile" [attr.aria-label]="'addon.mod_lesson.lessonmenu' | translate" | ||||||
|                 (click)="showMenu()"> |                 (click)="showMenu()"> | ||||||
| @ -46,15 +47,14 @@ | |||||||
|             <ion-card *ngIf="!eolData && !processData"> |             <ion-card *ngIf="!eolData && !processData"> | ||||||
|                 <!-- Content page. --> |                 <!-- Content page. --> | ||||||
|                 <ion-item class="ion-text-wrap" *ngIf="!question && pageContent"> |                 <ion-item class="ion-text-wrap" *ngIf="!question && pageContent"> | ||||||
|                     <core-format-text [component]="component" [componentId]="lesson.coursemodule" [text]="pageContent" |                     <core-format-text [component]="component" [componentId]="lesson.coursemodule" [text]="pageContent" contextLevel="module" | ||||||
|                         contextLevel="module" [contextInstanceId]="lesson.coursemodule" [courseId]="courseId"> |                         [contextInstanceId]="lesson.coursemodule" [courseId]="courseId"> | ||||||
|                     </core-format-text> |                     </core-format-text> | ||||||
|                 </ion-item> |                 </ion-item> | ||||||
| 
 | 
 | ||||||
|                 <!-- Question page. --> |                 <!-- Question page. --> | ||||||
|                 <!-- We need to set ngIf loaded to make formGroup directive restart every time a page changes, see MOBILE-2540. --> |                 <!-- We need to set ngIf loaded to make formGroup directive restart every time a page changes, see MOBILE-2540. --> | ||||||
|                 <form *ngIf="question && loaded" [formGroup]="questionForm" #questionFormEl |                 <form *ngIf="question && loaded" [formGroup]="questionForm" #questionFormEl (ngSubmit)="submitQuestion($event)"> | ||||||
|                     (ngSubmit)="submitQuestion($event)"> |  | ||||||
| 
 | 
 | ||||||
|                     <ion-item-divider class="ion-text-wrap" *ngIf="pageContent"> |                     <ion-item-divider class="ion-text-wrap" *ngIf="pageContent"> | ||||||
|                         <ion-label> |                         <ion-label> | ||||||
| @ -91,8 +91,8 @@ | |||||||
|                                     <h3 class="item-heading">{{ 'addon.mod_lesson.youranswer' | translate }}</h3> |                                     <h3 class="item-heading">{{ 'addon.mod_lesson.youranswer' | translate }}</h3> | ||||||
|                                     <p> |                                     <p> | ||||||
|                                         <core-format-text [component]="component" [componentId]="lesson?.coursemodule" |                                         <core-format-text [component]="component" [componentId]="lesson?.coursemodule" | ||||||
|                                             [text]="question.useranswer" contextLevel="module" |                                             [text]="question.useranswer" contextLevel="module" [contextInstanceId]="lesson?.coursemodule" | ||||||
|                                             [contextInstanceId]="lesson?.coursemodule" [courseId]="courseId"> |                                             [courseId]="courseId"> | ||||||
|                                         </core-format-text> |                                         </core-format-text> | ||||||
|                                     </p> |                                     </p> | ||||||
|                                 </ion-label> |                                 </ion-label> | ||||||
| @ -105,9 +105,8 @@ | |||||||
|                             <ion-radio-group *ngIf="!question.multi" [formControlName]="question.controlName"> |                             <ion-radio-group *ngIf="!question.multi" [formControlName]="question.controlName"> | ||||||
|                                 <ion-item class="ion-text-wrap" *ngFor="let option of question.options"> |                                 <ion-item class="ion-text-wrap" *ngFor="let option of question.options"> | ||||||
|                                     <ion-label> |                                     <ion-label> | ||||||
|                                         <core-format-text [component]="component" [componentId]="lesson.coursemodule" |                                         <core-format-text [component]="component" [componentId]="lesson.coursemodule" [text]="option.text" | ||||||
|                                             [text]="option.text" contextLevel="module" [contextInstanceId]="lesson?.coursemodule" |                                             contextLevel="module" [contextInstanceId]="lesson?.coursemodule" [courseId]="courseId"> | ||||||
|                                             [courseId]="courseId"> |  | ||||||
|                                         </core-format-text> |                                         </core-format-text> | ||||||
|                                     </ion-label> |                                     </ion-label> | ||||||
|                                     <ion-radio slot="end" [id]="option.id" [value]="option.value" [disabled]="option.disabled"> |                                     <ion-radio slot="end" [id]="option.id" [value]="option.value" [disabled]="option.disabled"> | ||||||
| @ -119,9 +118,8 @@ | |||||||
|                             <ng-container *ngIf="question.multi"> |                             <ng-container *ngIf="question.multi"> | ||||||
|                                 <ion-item class="ion-text-wrap" *ngFor="let option of question.options"> |                                 <ion-item class="ion-text-wrap" *ngFor="let option of question.options"> | ||||||
|                                     <ion-label> |                                     <ion-label> | ||||||
|                                         <core-format-text [component]="component" [componentId]="lesson?.coursemodule" |                                         <core-format-text [component]="component" [componentId]="lesson?.coursemodule" [text]="option.text" | ||||||
|                                             [text]="option.text" contextLevel="module" [contextInstanceId]="lesson?.coursemodule" |                                             contextLevel="module" [contextInstanceId]="lesson?.coursemodule" [courseId]="courseId"> | ||||||
|                                             [courseId]="courseId"> |  | ||||||
|                                         </core-format-text> |                                         </core-format-text> | ||||||
|                                     </ion-label> |                                     </ion-label> | ||||||
|                                     <ion-checkbox [id]="option.id" [formControlName]="option.name" slot="end"></ion-checkbox> |                                     <ion-checkbox [id]="option.id" [formControlName]="option.name" slot="end"></ion-checkbox> | ||||||
| @ -133,10 +131,12 @@ | |||||||
|                         <ng-container *ngSwitchCase="'matching'"> |                         <ng-container *ngSwitchCase="'matching'"> | ||||||
|                             <ion-item class="ion-text-wrap" *ngFor="let row of question.rows"> |                             <ion-item class="ion-text-wrap" *ngFor="let row of question.rows"> | ||||||
|                                 <ion-label> |                                 <ion-label> | ||||||
|                                     <p><core-format-text id="addon-mod_lesson-matching-{{row.id}}" [component]="component" |                                     <p> | ||||||
|  |                                         <core-format-text id="addon-mod_lesson-matching-{{row.id}}" [component]="component" | ||||||
|                                             [componentId]="lesson?.coursemodule" [text]="row.text" contextLevel="module" |                                             [componentId]="lesson?.coursemodule" [text]="row.text" contextLevel="module" | ||||||
|                                             [contextInstanceId]="lesson?.coursemodule" [courseId]="courseId"> |                                             [contextInstanceId]="lesson?.coursemodule" [courseId]="courseId"> | ||||||
|                                     </core-format-text></p> |                                         </core-format-text> | ||||||
|  |                                     </p> | ||||||
|                                 </ion-label> |                                 </ion-label> | ||||||
|                                 <ion-select [id]="row.id" [formControlName]="row.name" interface="action-sheet" |                                 <ion-select [id]="row.id" [formControlName]="row.name" interface="action-sheet" | ||||||
|                                     [attr.aria-labelledby]="'addon-mod_lesson-matching-' + row.id"> |                                     [attr.aria-labelledby]="'addon-mod_lesson-matching-' + row.id"> | ||||||
| @ -161,8 +161,8 @@ | |||||||
|                 <ion-grid *ngIf="pageButtons?.length" class="ion-text-wrap addon-mod_lesson-pagebuttons"> |                 <ion-grid *ngIf="pageButtons?.length" class="ion-text-wrap addon-mod_lesson-pagebuttons"> | ||||||
|                     <ion-row class="ion-align-items-center"> |                     <ion-row class="ion-align-items-center"> | ||||||
|                         <ion-col *ngFor="let button of pageButtons" size="12" size-md="6" size-lg="3" col-xl> |                         <ion-col *ngFor="let button of pageButtons" size="12" size-md="6" size-lg="3" col-xl> | ||||||
|                             <ion-button expand="block" fill="outline" [id]="button.id" |                             <ion-button expand="block" fill="outline" [id]="button.id" (click)="buttonClicked(button.data)" | ||||||
|                                 (click)="buttonClicked(button.data)" class="ion-text-wrap button-no-uppercase"> |                                 class="ion-text-wrap button-no-uppercase"> | ||||||
|                                 {{ button.content }} |                                 {{ button.content }} | ||||||
|                             </ion-button> |                             </ion-button> | ||||||
|                         </ion-col> |                         </ion-col> | ||||||
| @ -213,8 +213,7 @@ | |||||||
|                 <ion-item class="ion-text-wrap" *ngIf="eolData.displayscorewithessays" lines="none"> |                 <ion-item class="ion-text-wrap" *ngIf="eolData.displayscorewithessays" lines="none"> | ||||||
|                     <ion-label [innerHTML]="eolData.displayscorewithessays.message"></ion-label> |                     <ion-label [innerHTML]="eolData.displayscorewithessays.message"></ion-label> | ||||||
|                 </ion-item> |                 </ion-item> | ||||||
|                 <ion-item class="ion-text-wrap" *ngIf="!eolData.displayscorewithessays && eolData.displayscorewithoutessays" |                 <ion-item class="ion-text-wrap" *ngIf="!eolData.displayscorewithessays && eolData.displayscorewithoutessays" lines="none"> | ||||||
|                     lines="none"> |  | ||||||
|                     <ion-label>{{ eolData.displayscorewithoutessays.message }}</ion-label> |                     <ion-label>{{ eolData.displayscorewithoutessays.message }}</ion-label> | ||||||
|                 </ion-item> |                 </ion-item> | ||||||
|                 <ion-item class="ion-text-wrap" *ngIf="eolData.yourcurrentgradeisoutof" lines="none"> |                 <ion-item class="ion-text-wrap" *ngIf="eolData.yourcurrentgradeisoutof" lines="none"> | ||||||
| @ -247,19 +246,17 @@ | |||||||
|                     <ion-label>{{ eolData.modattemptsnoteacher.message }}</ion-label> |                     <ion-label>{{ eolData.modattemptsnoteacher.message }}</ion-label> | ||||||
|                 </ion-item> |                 </ion-item> | ||||||
|                 <!-- If activity link was successfully formatted, render the button. --> |                 <!-- If activity link was successfully formatted, render the button. --> | ||||||
|                 <ion-button *ngIf="activityLink && activityLink.formatted" |                 <ion-button *ngIf="activityLink && activityLink.formatted" expand="block" color="light" [href]="activityLink.href" core-link | ||||||
|                     expand="block" color="light" [href]="activityLink.href" core-link [capture]="true" |                     [capture]="true" class="ion-text-wrap ion-margin button-no-uppercase"> | ||||||
|                     class="ion-text-wrap ion-margin button-no-uppercase"> |                     <core-format-text [text]="activityLink.label" contextLevel="module" [contextInstanceId]="lesson?.coursemodule" | ||||||
|                     <core-format-text [text]="activityLink.label" contextLevel="module" |                         [courseId]="courseId"> | ||||||
|                         [contextInstanceId]="lesson?.coursemodule" [courseId]="courseId"> |  | ||||||
|                     </core-format-text> |                     </core-format-text> | ||||||
|                 </ion-button> |                 </ion-button> | ||||||
|                 <ion-item class="ion-text-wrap" *ngIf="activityLink && !activityLink.formatted" |                 <ion-item class="ion-text-wrap" *ngIf="activityLink && !activityLink.formatted" lines="none"> | ||||||
|                     lines="none"> |  | ||||||
|                     <!-- Activity link wasn't formatted, render the original link. --> |                     <!-- Activity link wasn't formatted, render the original link. --> | ||||||
|                     <ion-label> |                     <ion-label> | ||||||
|                         <core-format-text [text]="activityLink.label" contextLevel="module" |                         <core-format-text [text]="activityLink.label" contextLevel="module" [contextInstanceId]="lesson?.coursemodule" | ||||||
|                             [contextInstanceId]="lesson?.coursemodule" [courseId]="courseId"> |                             [courseId]="courseId"> | ||||||
|                         </core-format-text> |                         </core-format-text> | ||||||
|                     </ion-label> |                     </ion-label> | ||||||
|                 </ion-item> |                 </ion-item> | ||||||
| @ -267,15 +264,14 @@ | |||||||
| 
 | 
 | ||||||
|             <!-- Feedback returned when processing an action. --> |             <!-- Feedback returned when processing an action. --> | ||||||
|             <ion-list *ngIf="processData"> |             <ion-list *ngIf="processData"> | ||||||
|                 <ion-item class="ion-text-wrap" *ngIf="processData.ongoingscore && !processData.reviewmode" > |                 <ion-item class="ion-text-wrap" *ngIf="processData.ongoingscore && !processData.reviewmode"> | ||||||
|                     <ion-label>{{ processData.ongoingscore }}</ion-label> |                     <ion-label>{{ processData.ongoingscore }}</ion-label> | ||||||
|                 </ion-item> |                 </ion-item> | ||||||
|                 <ion-item class="ion-text-wrap" *ngIf="!processData.reviewmode || review"> |                 <ion-item class="ion-text-wrap" *ngIf="!processData.reviewmode || review"> | ||||||
|                     <ion-label> |                     <ion-label> | ||||||
|                         <div *ngIf="!processData.reviewmode"> |                         <div *ngIf="!processData.reviewmode"> | ||||||
|                             <core-format-text [component]="component" [componentId]="lesson?.coursemodule" |                             <core-format-text [component]="component" [componentId]="lesson?.coursemodule" [text]="processData.feedback" | ||||||
|                                 [text]="processData.feedback" contextLevel="module" [contextInstanceId]="lesson?.coursemodule" |                                 contextLevel="module" [contextInstanceId]="lesson?.coursemodule" [courseId]="courseId"> | ||||||
|                                 [courseId]="courseId"> |  | ||||||
|                             </core-format-text> |                             </core-format-text> | ||||||
|                         </div> |                         </div> | ||||||
|                         <div *ngIf="review"> |                         <div *ngIf="review"> | ||||||
| @ -286,8 +282,7 @@ | |||||||
|                     </ion-label> |                     </ion-label> | ||||||
|                 </ion-item> |                 </ion-item> | ||||||
| 
 | 
 | ||||||
|                 <ion-button expand="block" class="ion-text-wrap ion-margin" color="light" *ngIf="review" |                 <ion-button expand="block" class="ion-text-wrap ion-margin" color="light" *ngIf="review" (click)="changePage(LESSON_EOL)"> | ||||||
|                     (click)="changePage(LESSON_EOL)"> |  | ||||||
|                     {{ 'addon.mod_lesson.finish' | translate }} |                     {{ 'addon.mod_lesson.finish' | translate }} | ||||||
|                 </ion-button> |                 </ion-button> | ||||||
|                 <ion-button expand="block" class="ion-text-wrap ion-margin" color="light" *ngFor="let button of processDataButtons" |                 <ion-button expand="block" class="ion-text-wrap ion-margin" color="light" *ngFor="let button of processDataButtons" | ||||||
|  | |||||||
| @ -3,7 +3,9 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1>{{ 'addon.mod_lesson.detailedstats' | translate }}</h1> |             <h1>{{ 'addon.mod_lesson.detailedstats' | translate }}</h1> | ||||||
|  |         </ion-title> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content> | ||||||
| @ -133,8 +135,8 @@ | |||||||
|                                     <ion-label> |                                     <ion-label> | ||||||
|                                         <p> |                                         <p> | ||||||
|                                             <core-format-text [component]="component" [componentId]="lesson?.coursemodule" |                                             <core-format-text [component]="component" [componentId]="lesson?.coursemodule" | ||||||
|                                                 [text]="answer[0].content" contextLevel="module" |                                                 [text]="answer[0].content" contextLevel="module" [contextInstanceId]="lesson?.coursemodule" | ||||||
|                                                 [contextInstanceId]="lesson?.coursemodule" [courseId]="courseId"> |                                                 [courseId]="courseId"> | ||||||
|                                             </core-format-text> |                                             </core-format-text> | ||||||
|                                         </p> |                                         </p> | ||||||
|                                         <ion-badge *ngIf="answer[1]" color="dark"> |                                         <ion-badge *ngIf="answer[1]" color="dark"> | ||||||
| @ -144,8 +146,7 @@ | |||||||
|                                             </core-format-text> |                                             </core-format-text> | ||||||
|                                         </ion-badge> |                                         </ion-badge> | ||||||
|                                     </ion-label> |                                     </ion-label> | ||||||
|                                     <ion-checkbox [attr.name]="answer[0].name" [ngModel]="answer[0].checked" [disabled]="true" |                                     <ion-checkbox [attr.name]="answer[0].name" [ngModel]="answer[0].checked" [disabled]="true" slot="end"> | ||||||
|                                         slot="end"> |  | ||||||
|                                     </ion-checkbox> |                                     </ion-checkbox> | ||||||
|                                 </ion-item> |                                 </ion-item> | ||||||
| 
 | 
 | ||||||
| @ -213,15 +214,13 @@ | |||||||
|                                 <!-- Another page (end of branch, ...). --> |                                 <!-- Another page (end of branch, ...). --> | ||||||
|                                 <ion-label> |                                 <ion-label> | ||||||
|                                     <p> |                                     <p> | ||||||
|                                         <core-format-text [component]="component" [componentId]="lesson?.coursemodule" |                                         <core-format-text [component]="component" [componentId]="lesson?.coursemodule" [text]="answer[0]" | ||||||
|                                             [text]="answer[0]" contextLevel="module" [contextInstanceId]="lesson?.coursemodule" |                                             contextLevel="module" [contextInstanceId]="lesson?.coursemodule" [courseId]="courseId"> | ||||||
|                                             [courseId]="courseId"> |  | ||||||
|                                         </core-format-text> |                                         </core-format-text> | ||||||
|                                     </p> |                                     </p> | ||||||
|                                     <ion-badge *ngIf="answer[1]" color="dark"> |                                     <ion-badge *ngIf="answer[1]" color="dark"> | ||||||
|                                         <core-format-text [component]="component" [componentId]="lesson?.coursemodule" |                                         <core-format-text [component]="component" [componentId]="lesson?.coursemodule" [text]="answer[1]" | ||||||
|                                             [text]="answer[1]" contextLevel="module" [contextInstanceId]="lesson?.coursemodule" |                                             contextLevel="module" [contextInstanceId]="lesson?.coursemodule" [courseId]="courseId"> | ||||||
|                                             [courseId]="courseId"> |  | ||||||
|                                         </core-format-text> |                                         </core-format-text> | ||||||
|                                     </ion-badge> |                                     </ion-badge> | ||||||
|                                 </ion-label> |                                 </ion-label> | ||||||
| @ -233,14 +232,16 @@ | |||||||
|                                 <h3 class="item-heading">{{ 'addon.mod_lesson.response' | translate }}</h3> |                                 <h3 class="item-heading">{{ 'addon.mod_lesson.response' | translate }}</h3> | ||||||
|                                 <p> |                                 <p> | ||||||
|                                     <core-format-text [component]="component" [componentId]="lesson?.coursemodule" |                                     <core-format-text [component]="component" [componentId]="lesson?.coursemodule" | ||||||
|                                         [text]="page.answerdata.response" contextLevel="module" |                                         [text]="page.answerdata.response" contextLevel="module" [contextInstanceId]="lesson?.coursemodule" | ||||||
|                                         [contextInstanceId]="lesson?.coursemodule" [courseId]="courseId"> |                                         [courseId]="courseId"> | ||||||
|                                     </core-format-text> |                                     </core-format-text> | ||||||
|                                 </p> |                                 </p> | ||||||
|                             </ion-label> |                             </ion-label> | ||||||
|                         </ion-item> |                         </ion-item> | ||||||
|                         <ion-item class="ion-text-wrap" *ngIf="page.answerdata.score"> |                         <ion-item class="ion-text-wrap" *ngIf="page.answerdata.score"> | ||||||
|                             <ion-label><p>{{page.answerdata.score}}</p></ion-label> |                             <ion-label> | ||||||
|  |                                 <p>{{page.answerdata.score}}</p> | ||||||
|  |                             </ion-label> | ||||||
|                         </ion-item> |                         </ion-item> | ||||||
|                     </div> |                     </div> | ||||||
|                 </ion-card> |                 </ion-card> | ||||||
|  | |||||||
| @ -3,10 +3,12 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1> |             <h1> | ||||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId"> |                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId"> | ||||||
|                 </core-format-text> |                 </core-format-text> | ||||||
|             </h1> |             </h1> | ||||||
|  |         </ion-title> | ||||||
| 
 | 
 | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <!-- The buttons defined by the component will be added in here. --> |             <!-- The buttons defined by the component will be added in here. --> | ||||||
|  | |||||||
| @ -3,10 +3,12 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1> |             <h1> | ||||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> |                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> | ||||||
|                 </core-format-text> |                 </core-format-text> | ||||||
|             </h1> |             </h1> | ||||||
|  |         </ion-title> | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <!-- The buttons defined by the component will be added in here. --> |             <!-- The buttons defined by the component will be added in here. --> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  | |||||||
| @ -1,7 +1,8 @@ | |||||||
| <ion-header> | <ion-header> | ||||||
|     <ion-toolbar> |     <ion-toolbar> | ||||||
|  |         <ion-title> | ||||||
|             <h2>{{ 'addon.mod_quiz.quiznavigation' | translate }}</h2> |             <h2>{{ 'addon.mod_quiz.quiznavigation' | translate }}</h2> | ||||||
| 
 |         </ion-title> | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate"> |             <ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate"> | ||||||
|                 <ion-icon slot="icon-only" name="fas-times" aria-hidden="true"></ion-icon> |                 <ion-icon slot="icon-only" name="fas-times" aria-hidden="true"></ion-icon> | ||||||
| @ -41,12 +42,12 @@ | |||||||
|                 <ion-icon *ngIf="question.stateClass == 'core-question-correct'" name="fas-check" color="success" |                 <ion-icon *ngIf="question.stateClass == 'core-question-correct'" name="fas-check" color="success" | ||||||
|                     [attr.aria-label]="question.status" slot="end"> |                     [attr.aria-label]="question.status" slot="end"> | ||||||
|                 </ion-icon> |                 </ion-icon> | ||||||
|                 <ion-icon *ngIf="question.stateClass == 'core-question-partiallycorrect'" name="fas-check-square" |                 <ion-icon *ngIf="question.stateClass == 'core-question-partiallycorrect'" name="fas-check-square" color="warning" | ||||||
|                     color="warning" [attr.aria-label]="question.status" slot="end"> |                     [attr.aria-label]="question.status" slot="end"> | ||||||
|                 </ion-icon> |                 </ion-icon> | ||||||
|                 <ion-icon *ngIf="question.stateClass == 'core-question-incorrect' || |                 <ion-icon *ngIf="question.stateClass == 'core-question-incorrect' || | ||||||
|                     question.stateClass == 'core-question-notanswered'" name="fas-times" color="danger" |                     question.stateClass == 'core-question-notanswered'" name="fas-times" color="danger" [attr.aria-label]="question.status" | ||||||
|                     [attr.aria-label]="question.status" slot="end"> |                     slot="end"> | ||||||
|                 </ion-icon> |                 </ion-icon> | ||||||
|             </ion-item> |             </ion-item> | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,7 +1,8 @@ | |||||||
| <ion-header> | <ion-header> | ||||||
|     <ion-toolbar> |     <ion-toolbar> | ||||||
|  |         <ion-title> | ||||||
|             <h2>{{ title | translate }}</h2> |             <h2>{{ title | translate }}</h2> | ||||||
| 
 |         </ion-title> | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate"> |             <ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate"> | ||||||
|                 <ion-icon slot="icon-only" name="fas-times" aria-hidden="true"></ion-icon> |                 <ion-icon slot="icon-only" name="fas-times" aria-hidden="true"></ion-icon> | ||||||
|  | |||||||
| @ -3,11 +3,13 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1> |             <h1> | ||||||
|                 <core-format-text *ngIf="quiz" [text]="quiz.name" contextLevel="module" [contextInstanceId]="quiz.coursemodule" |                 <core-format-text *ngIf="quiz" [text]="quiz.name" contextLevel="module" [contextInstanceId]="quiz.coursemodule" | ||||||
|                     [courseId]="courseId"> |                     [courseId]="courseId"> | ||||||
|                 </core-format-text> |                 </core-format-text> | ||||||
|             </h1> |             </h1> | ||||||
|  |         </ion-title> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content> | ||||||
| @ -45,8 +47,8 @@ | |||||||
|                 <ion-label> |                 <ion-label> | ||||||
|                     <h2>{{ 'addon.mod_quiz.feedback' | translate }}</h2> |                     <h2>{{ 'addon.mod_quiz.feedback' | translate }}</h2> | ||||||
|                     <p> |                     <p> | ||||||
|                         <core-format-text [component]="component" [componentId]="componentId" [text]="feedback" |                         <core-format-text [component]="component" [componentId]="componentId" [text]="feedback" contextLevel="module" | ||||||
|                             contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId"> |                             [contextInstanceId]="cmId" [courseId]="courseId"> | ||||||
|                         </core-format-text> |                         </core-format-text> | ||||||
|                     </p> |                     </p> | ||||||
|                 </ion-label> |                 </ion-label> | ||||||
|  | |||||||
| @ -3,10 +3,12 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1> |             <h1> | ||||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> |                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> | ||||||
|                 </core-format-text> |                 </core-format-text> | ||||||
|             </h1> |             </h1> | ||||||
|  |         </ion-title> | ||||||
| 
 | 
 | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <!-- The buttons defined by the component will be added in here. --> |             <!-- The buttons defined by the component will be added in here. --> | ||||||
|  | |||||||
| @ -3,11 +3,13 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1> |             <h1> | ||||||
|                 <core-format-text *ngIf="quiz" [text]="quiz.name" contextLevel="module" [contextInstanceId]="quiz.coursemodule" |                 <core-format-text *ngIf="quiz" [text]="quiz.name" contextLevel="module" [contextInstanceId]="quiz.coursemodule" | ||||||
|                     [courseId]="courseId"> |                     [courseId]="courseId"> | ||||||
|                 </core-format-text> |                 </core-format-text> | ||||||
|             </h1> |             </h1> | ||||||
|  |         </ion-title> | ||||||
| 
 | 
 | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <ion-button fill="clear" id="addon-mod_quiz-connection-error-button" [hidden]="!autoSaveError" |             <ion-button fill="clear" id="addon-mod_quiz-connection-error-button" [hidden]="!autoSaveError" | ||||||
| @ -15,8 +17,7 @@ | |||||||
|                 aria-haspopup="dialog"> |                 aria-haspopup="dialog"> | ||||||
|                 <ion-icon name="fas-exclamation-circle" slot="icon-only" aria-hidden="true"></ion-icon> |                 <ion-icon name="fas-exclamation-circle" slot="icon-only" aria-hidden="true"></ion-icon> | ||||||
|             </ion-button> |             </ion-button> | ||||||
|             <ion-button *ngIf="navigation.length" [attr.aria-label]="'addon.mod_quiz.opentoc' | translate" |             <ion-button *ngIf="navigation.length" [attr.aria-label]="'addon.mod_quiz.opentoc' | translate" (click)="openNavigation()"> | ||||||
|                 (click)="openNavigation()"> |  | ||||||
|                 <ion-icon name="fas-bookmark" slot="icon-only" aria-hidden="true"></ion-icon> |                 <ion-icon name="fas-bookmark" slot="icon-only" aria-hidden="true"></ion-icon> | ||||||
|             </ion-button> |             </ion-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
| @ -24,8 +25,7 @@ | |||||||
|     <!-- Navigation arrows and time left. --> |     <!-- Navigation arrows and time left. --> | ||||||
|     <ion-toolbar *ngIf="loaded && endTime && questions.length && !quizAborted && !showSummary" color="light"> |     <ion-toolbar *ngIf="loaded && endTime && questions.length && !quizAborted && !showSummary" color="light"> | ||||||
|         <ion-title> |         <ion-title> | ||||||
|             <core-timer [endTime]="endTime" (finished)="timeUp()" [timerText]="'addon.mod_quiz.timeleft' | translate" |             <core-timer [endTime]="endTime" (finished)="timeUp()" [timerText]="'addon.mod_quiz.timeleft' | translate" [align]="'center'"> | ||||||
|                 [align]="'center'"> |  | ||||||
|             </core-timer> |             </core-timer> | ||||||
|         </ion-title> |         </ion-title> | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
| @ -79,10 +79,9 @@ | |||||||
|                     </ion-item-divider> |                     </ion-item-divider> | ||||||
| 
 | 
 | ||||||
|                     <!-- Body of the question. --> |                     <!-- Body of the question. --> | ||||||
|                     <core-question class="ion-text-wrap" [question]="question" [component]="component" |                     <core-question class="ion-text-wrap" [question]="question" [component]="component" [componentId]="cmId" | ||||||
|                         [componentId]="cmId" [attemptId]="attempt!.id" [usageId]="attempt!.uniqueid" |                         [attemptId]="attempt!.id" [usageId]="attempt!.uniqueid" [offlineEnabled]="offline" contextLevel="module" | ||||||
|                         [offlineEnabled]="offline" contextLevel="module" [contextInstanceId]="cmId" |                         [contextInstanceId]="cmId" [courseId]="courseId" [preferredBehaviour]="quiz!.preferredbehaviour" [review]="false" | ||||||
|                         [courseId]="courseId" [preferredBehaviour]="quiz!.preferredbehaviour" [review]="false" |  | ||||||
|                         (onAbort)="abortQuiz()" (buttonClicked)="behaviourButtonClicked($event)"> |                         (onAbort)="abortQuiz()" (buttonClicked)="behaviourButtonClicked($event)"> | ||||||
|                     </core-question> |                     </core-question> | ||||||
|                 </ion-card> |                 </ion-card> | ||||||
| @ -92,7 +91,7 @@ | |||||||
|         <!-- Go to next or previous page. --> |         <!-- Go to next or previous page. --> | ||||||
|         <ion-grid class="ion-text-wrap" *ngIf="questions.length && !quizAborted && !showSummary"> |         <ion-grid class="ion-text-wrap" *ngIf="questions.length && !quizAborted && !showSummary"> | ||||||
|             <ion-row> |             <ion-row> | ||||||
|                 <ion-col *ngIf="previousPage >= 0" > |                 <ion-col *ngIf="previousPage >= 0"> | ||||||
|                     <ion-button expand="block" color="light" (click)="changePage(previousPage)"> |                     <ion-button expand="block" color="light" (click)="changePage(previousPage)"> | ||||||
|                         <ion-icon name="fas-chevron-left" slot="start" aria-hidden="true"></ion-icon> |                         <ion-icon name="fas-chevron-left" slot="start" aria-hidden="true"></ion-icon> | ||||||
|                         {{ 'core.previous' | translate }} |                         {{ 'core.previous' | translate }} | ||||||
| @ -131,8 +130,8 @@ | |||||||
|             <!-- List of questions of the summary table. --> |             <!-- List of questions of the summary table. --> | ||||||
|             <ng-container *ngFor="let question of summaryQuestions"> |             <ng-container *ngFor="let question of summaryQuestions"> | ||||||
|                 <ion-item *ngIf="question.number" (click)="changePage(question.page, false, question.slot)" |                 <ion-item *ngIf="question.number" (click)="changePage(question.page, false, question.slot)" | ||||||
|                     [attr.aria-label]="'core.question.questionno' | translate:{$a: question.number}" |                     [attr.aria-label]="'core.question.questionno' | translate:{$a: question.number}" [detail]="!isSequential && canReturn" | ||||||
|                     [detail]="!isSequential && canReturn" [button]="!isSequential && canReturn"> |                     [button]="!isSequential && canReturn"> | ||||||
|                     <ion-label> |                     <ion-label> | ||||||
|                         <ion-row class="ion-align-items-center"> |                         <ion-row class="ion-align-items-center"> | ||||||
|                             <ion-col size="3" class="ion-text-center">{{ question.number }}</ion-col> |                             <ion-col size="3" class="ion-text-center">{{ question.number }}</ion-col> | ||||||
| @ -153,8 +152,7 @@ | |||||||
|             </ion-item> |             </ion-item> | ||||||
| 
 | 
 | ||||||
|             <!-- Time left (if quiz is timed). --> |             <!-- Time left (if quiz is timed). --> | ||||||
|             <core-timer *ngIf="endTime" [endTime]="endTime" (finished)="timeUp()" |             <core-timer *ngIf="endTime" [endTime]="endTime" (finished)="timeUp()" [timerText]="'addon.mod_quiz.timeleft' | translate"> | ||||||
|                 [timerText]="'addon.mod_quiz.timeleft' | translate"> |  | ||||||
|             </core-timer> |             </core-timer> | ||||||
| 
 | 
 | ||||||
|             <!-- List of messages explaining why the quiz cannot be submitted. --> |             <!-- List of messages explaining why the quiz cannot be submitted. --> | ||||||
| @ -165,15 +163,14 @@ | |||||||
|                 </ion-label> |                 </ion-label> | ||||||
|             </ion-item> |             </ion-item> | ||||||
| 
 | 
 | ||||||
|             <ion-button *ngIf="preventSubmitMessages.length" expand="block" [href]="moduleUrl" core-link |             <ion-button *ngIf="preventSubmitMessages.length" expand="block" [href]="moduleUrl" core-link [showBrowserWarning]="false"> | ||||||
|                 [showBrowserWarning]="false"> |  | ||||||
|                 {{ 'core.openinbrowser' | translate }} |                 {{ 'core.openinbrowser' | translate }} | ||||||
|                 <ion-icon name="fas-external-link-alt" slot="end" aria-hidden="true"></ion-icon> |                 <ion-icon name="fas-external-link-alt" slot="end" aria-hidden="true"></ion-icon> | ||||||
|             </ion-button> |             </ion-button> | ||||||
| 
 | 
 | ||||||
|             <!-- Button to submit the quiz. --> |             <!-- Button to submit the quiz. --> | ||||||
|             <ion-button *ngIf="!attempt!.finishedOffline && !preventSubmitMessages.length" expand="block" |             <ion-button *ngIf="!attempt!.finishedOffline && !preventSubmitMessages.length" expand="block" class="ion-margin" | ||||||
|                 class="ion-margin" (click)="finishAttempt(true)"> |                 (click)="finishAttempt(true)"> | ||||||
|                 {{ 'addon.mod_quiz.submitallandfinish' | translate }} |                 {{ 'addon.mod_quiz.submitallandfinish' | translate }} | ||||||
|             </ion-button> |             </ion-button> | ||||||
|         </ion-card> |         </ion-card> | ||||||
|  | |||||||
| @ -3,7 +3,9 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1>{{ 'addon.mod_quiz.review' | translate }}</h1> |             <h1>{{ 'addon.mod_quiz.review' | translate }}</h1> | ||||||
|  |         </ion-title> | ||||||
| 
 | 
 | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <ion-button fill="clear" *ngIf="navigation.length" [attr.aria-label]="'addon.mod_quiz.opentoc' | translate" |             <ion-button fill="clear" *ngIf="navigation.length" [attr.aria-label]="'addon.mod_quiz.opentoc' | translate" | ||||||
| @ -75,8 +77,8 @@ | |||||||
|                 <ion-item class="ion-text-wrap" *ngFor="let data of additionalData"> |                 <ion-item class="ion-text-wrap" *ngFor="let data of additionalData"> | ||||||
|                     <ion-label> |                     <ion-label> | ||||||
|                         <p class="item-heading">{{ data.title }}</p> |                         <p class="item-heading">{{ data.title }}</p> | ||||||
|                         <core-format-text [component]="component" [componentId]="cmId" [text]="data.content" |                         <core-format-text [component]="component" [componentId]="cmId" [text]="data.content" contextLevel="module" | ||||||
|                             contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId"> |                             [contextInstanceId]="cmId" [courseId]="courseId"> | ||||||
|                         </core-format-text> |                         </core-format-text> | ||||||
|                     </ion-label> |                     </ion-label> | ||||||
|                 </ion-item> |                 </ion-item> | ||||||
| @ -107,8 +109,7 @@ | |||||||
|                     <!-- Body of the question. --> |                     <!-- Body of the question. --> | ||||||
|                     <core-question class="ion-text-wrap" [question]="question" [component]="component" [componentId]="cmId" |                     <core-question class="ion-text-wrap" [question]="question" [component]="component" [componentId]="cmId" | ||||||
|                         [attemptId]="attempt.id" [usageId]="attempt.uniqueid" [offlineEnabled]="false" contextLevel="module" |                         [attemptId]="attempt.id" [usageId]="attempt.uniqueid" [offlineEnabled]="false" contextLevel="module" | ||||||
|                         [contextInstanceId]="cmId" [courseId]="courseId" [review]="true" |                         [contextInstanceId]="cmId" [courseId]="courseId" [review]="true" [preferredBehaviour]="quiz?.preferredbehaviour"> | ||||||
|                         [preferredBehaviour]="quiz?.preferredbehaviour"> |  | ||||||
|                     </core-question> |                     </core-question> | ||||||
|                 </ion-card> |                 </ion-card> | ||||||
|             </div> |             </div> | ||||||
| @ -130,8 +131,7 @@ | |||||||
|                 </ion-button> |                 </ion-button> | ||||||
|             </ion-col> |             </ion-col> | ||||||
|             <ion-col class="ion-text-end"> |             <ion-col class="ion-text-end"> | ||||||
|                 <ion-button color="light" *ngIf="nextPage >= -1" (click)="changePage(nextPage)" |                 <ion-button color="light" *ngIf="nextPage >= -1" (click)="changePage(nextPage)" [attr.aria-label]="'core.next' | translate"> | ||||||
|                     [attr.aria-label]="'core.next' | translate"> |  | ||||||
|                     <ion-icon name="fas-chevron-right" slot="icon-only" aria-hidden="true"></ion-icon> |                     <ion-icon name="fas-chevron-right" slot="icon-only" aria-hidden="true"></ion-icon> | ||||||
|                 </ion-button> |                 </ion-button> | ||||||
|             </ion-col> |             </ion-col> | ||||||
|  | |||||||
| @ -3,10 +3,12 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1> |             <h1> | ||||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> |                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> | ||||||
|                 </core-format-text> |                 </core-format-text> | ||||||
|             </h1> |             </h1> | ||||||
|  |         </ion-title> | ||||||
| 
 | 
 | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <!-- The buttons defined by the component will be added in here. --> |             <!-- The buttons defined by the component will be added in here. --> | ||||||
|  | |||||||
| @ -1,6 +1,8 @@ | |||||||
| <ion-header> | <ion-header> | ||||||
|     <ion-toolbar> |     <ion-toolbar> | ||||||
|         <h1>{{ 'addon.mod_scorm.toc' | translate }}</h1> |         <ion-title> | ||||||
|  |             <h2>{{ 'addon.mod_scorm.toc' | translate }}</h2> | ||||||
|  |         </ion-title> | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate"> |             <ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate"> | ||||||
|                 <ion-icon slot="icon-only" name="fas-times" aria-hidden="true"></ion-icon> |                 <ion-icon slot="icon-only" name="fas-times" aria-hidden="true"></ion-icon> | ||||||
| @ -36,8 +38,7 @@ | |||||||
|                     <ion-icon *ngIf="sco.icon" [name]="sco.icon.icon" [attr.aria-label]="sco.icon.description" slot="start"> |                     <ion-icon *ngIf="sco.icon" [name]="sco.icon.icon" [attr.aria-label]="sco.icon.description" slot="start"> | ||||||
|                     </ion-icon> |                     </ion-icon> | ||||||
|                     <ion-label> |                     <ion-label> | ||||||
|                         <core-format-text [text]="sco.title" contextLevel="module" [contextInstanceId]="moduleId" |                         <core-format-text [text]="sco.title" contextLevel="module" [contextInstanceId]="moduleId" [courseId]="courseId"> | ||||||
|                             [courseId]="courseId"> |  | ||||||
|                         </core-format-text> |                         </core-format-text> | ||||||
|                         <span *ngIf="accessInfo && accessInfo.canviewscores && sco.scoreraw"> |                         <span *ngIf="accessInfo && accessInfo.canviewscores && sco.scoreraw"> | ||||||
|                             ({{ 'addon.mod_scorm.score' | translate }}: {{sco.scoreraw}}) |                             ({{ 'addon.mod_scorm.score' | translate }}: {{sco.scoreraw}}) | ||||||
|  | |||||||
| @ -3,10 +3,12 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1> |             <h1> | ||||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> |                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> | ||||||
|                 </core-format-text> |                 </core-format-text> | ||||||
|             </h1> |             </h1> | ||||||
|  |         </ion-title> | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <!-- The buttons defined by the component will be added in here. --> |             <!-- The buttons defined by the component will be added in here. --> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  | |||||||
| @ -3,14 +3,16 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1> |             <h1> | ||||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId"> |                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId"> | ||||||
|                 </core-format-text> |                 </core-format-text> | ||||||
|             </h1> |             </h1> | ||||||
|  |         </ion-title> | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <core-button-with-spinner *ngIf="showToc" [loading]="loadingToc"> |             <core-button-with-spinner *ngIf="showToc" [loading]="loadingToc"> | ||||||
|                 <ion-button fill="clear" *ngIf="toc.length" (click)="openToc()" |                 <ion-button fill="clear" *ngIf="toc.length" (click)="openToc()" [attr.aria-label]="'addon.mod_scorm.toc' | translate" | ||||||
|                     [attr.aria-label]="'addon.mod_scorm.toc' | translate" aria-haspopup="true"> |                     aria-haspopup="true"> | ||||||
|                     <ion-icon name="fas-bookmark" slot="icon-only" aria-hidden="true"></ion-icon> |                     <ion-icon name="fas-bookmark" slot="icon-only" aria-hidden="true"></ion-icon> | ||||||
|                 </ion-button> |                 </ion-button> | ||||||
|             </core-button-with-spinner> |             </core-button-with-spinner> | ||||||
|  | |||||||
| @ -3,9 +3,11 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1> |             <h1> | ||||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module.id"></core-format-text> |                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module.id"></core-format-text> | ||||||
|             </h1> |             </h1> | ||||||
|  |         </ion-title> | ||||||
| 
 | 
 | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <!-- The buttons defined by the component will be added in here. --> |             <!-- The buttons defined by the component will be added in here. --> | ||||||
|  | |||||||
| @ -3,9 +3,11 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1> |             <h1> | ||||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id"></core-format-text> |                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id"></core-format-text> | ||||||
|             </h1> |             </h1> | ||||||
|  |         </ion-title> | ||||||
| 
 | 
 | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <!-- The buttons defined by the component will be added in here. --> |             <!-- The buttons defined by the component will be added in here. --> | ||||||
|  | |||||||
| @ -50,13 +50,13 @@ | |||||||
|     <!-- Activity info. --> |     <!-- Activity info. --> | ||||||
|     <core-course-module-info [module]="module" (completionChanged)="onCompletionChange()" [description]="description" |     <core-course-module-info [module]="module" (completionChanged)="onCompletionChange()" [description]="description" | ||||||
|         [component]="component" [componentId]="componentId" [courseId]="courseId"> |         [component]="component" [componentId]="componentId" [courseId]="courseId"> | ||||||
|         <h3 *ngIf="pageTitle" title>{{pageTitle}}</h3> |         <h2 *ngIf="pageTitle" title>{{pageTitle}}</h2> | ||||||
|     </core-course-module-info> |     </core-course-module-info> | ||||||
| 
 | 
 | ||||||
|     <div *ngIf="pageIsOffline || hasOffline || pageWarning"> |     <div *ngIf="pageIsOffline || hasOffline || pageWarning"> | ||||||
|         <!-- Wiki has something offline. --> |         <!-- Wiki has something offline. --> | ||||||
|         <ion-card class="core-warning-card" *ngIf="pageIsOffline || hasOffline"> |         <ion-card class="core-warning-card" *ngIf="pageIsOffline || hasOffline"> | ||||||
|             <ion-item> |             <ion-item class="ion-text-wrap"> | ||||||
|                 <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> |                 <ion-label> | ||||||
|                     <span *ngIf="pageIsOffline">{{ 'core.hasdatatosync' | translate:{$a: pageStr} }}</span> |                     <span *ngIf="pageIsOffline">{{ 'core.hasdatatosync' | translate:{$a: pageStr} }}</span> | ||||||
|  | |||||||
| @ -1,6 +1,8 @@ | |||||||
| <ion-header> | <ion-header> | ||||||
|     <ion-toolbar> |     <ion-toolbar> | ||||||
|         <h1>{{ 'addon.mod_wiki.map' | translate }}</h1> |         <ion-title> | ||||||
|  |             <h2>{{ 'addon.mod_wiki.map' | translate }}</h2> | ||||||
|  |         </ion-title> | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate"> |             <ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate"> | ||||||
|                 <ion-icon slot="icon-only" name="fas-times" aria-hidden="true"></ion-icon> |                 <ion-icon slot="icon-only" name="fas-times" aria-hidden="true"></ion-icon> | ||||||
| @ -18,14 +20,15 @@ | |||||||
|             </ion-item> |             </ion-item> | ||||||
|             <ng-container *ngFor="let letter of map"> |             <ng-container *ngFor="let letter of map"> | ||||||
|                 <ion-item-divider *ngIf="letter.label"> |                 <ion-item-divider *ngIf="letter.label"> | ||||||
|                     <ion-label><h2>{{ letter.label }}</h2></ion-label> |                     <ion-label> | ||||||
|  |                         <h2>{{ letter.label }}</h2> | ||||||
|  |                     </ion-label> | ||||||
|                 </ion-item-divider> |                 </ion-item-divider> | ||||||
|                 <ion-item class="ion-text-wrap" *ngFor="let page of letter.pages" (click)="goToPage(page)" |                 <ion-item class="ion-text-wrap" *ngFor="let page of letter.pages" (click)="goToPage(page)" | ||||||
|                     [attr.aria-current]="selectedTitle == page.title ? 'page' : 'false'" button detail="false"> |                     [attr.aria-current]="selectedTitle == page.title ? 'page' : 'false'" button detail="false"> | ||||||
|                     <ion-icon name="fas-home" slot="start" *ngIf="page.firstpage" aria-hidden="true"></ion-icon> |                     <ion-icon name="fas-home" slot="start" *ngIf="page.firstpage" aria-hidden="true"></ion-icon> | ||||||
|                     <ion-label> |                     <ion-label> | ||||||
|                         <core-format-text [text]="page.title" contextLevel="module" [contextInstanceId]="moduleId" |                         <core-format-text [text]="page.title" contextLevel="module" [contextInstanceId]="moduleId" [courseId]="courseId"> | ||||||
|                             [courseId]="courseId"> |  | ||||||
|                         </core-format-text> |                         </core-format-text> | ||||||
|                     </ion-label> |                     </ion-label> | ||||||
|                     <ion-note *ngIf="!page.id" slot="end"> |                     <ion-note *ngIf="!page.id" slot="end"> | ||||||
|  | |||||||
| @ -3,10 +3,12 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1> |             <h1> | ||||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId"> |                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId"> | ||||||
|                 </core-format-text> |                 </core-format-text> | ||||||
|             </h1> |             </h1> | ||||||
|  |         </ion-title> | ||||||
| 
 | 
 | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <ion-button fill="clear" (click)="save()"> |             <ion-button fill="clear" (click)="save()"> | ||||||
| @ -20,20 +22,19 @@ | |||||||
|         <form [formGroup]="pageForm" #editPageForm *ngIf="loaded"> |         <form [formGroup]="pageForm" #editPageForm *ngIf="loaded"> | ||||||
|             <ion-item class="ion-text-wrap" *ngIf="canEditTitle"> |             <ion-item class="ion-text-wrap" *ngIf="canEditTitle"> | ||||||
|                 <ion-label class="sr-only">{{ 'addon.mod_wiki.newpagetitle' | translate }}</ion-label> |                 <ion-label class="sr-only">{{ 'addon.mod_wiki.newpagetitle' | translate }}</ion-label> | ||||||
|                 <ion-input name="title" type="text" [placeholder]="'addon.mod_wiki.newpagetitle' | translate" |                 <ion-input name="title" type="text" [placeholder]="'addon.mod_wiki.newpagetitle' | translate" formControlName="title"> | ||||||
|                     formControlName="title"> |  | ||||||
|                 </ion-input> |                 </ion-input> | ||||||
|             </ion-item> |             </ion-item> | ||||||
| 
 | 
 | ||||||
|             <ion-item> |             <ion-item> | ||||||
|                 <ion-label class="sr-only">{{ 'core.content' | translate }}</ion-label> |                 <ion-label class="sr-only">{{ 'core.content' | translate }}</ion-label> | ||||||
|                 <core-rich-text-editor [control]="contentControl" [placeholder]="'core.content' | translate" |                 <core-rich-text-editor [control]="contentControl" [placeholder]="'core.content' | translate" name="wiki_page_content" | ||||||
|                     name="wiki_page_content" [component]="component" [componentId]="cmId" [autoSave]="true" contextLevel="module" |                     [component]="component" [componentId]="cmId" [autoSave]="true" contextLevel="module" [contextInstanceId]="cmId" | ||||||
|                     [contextInstanceId]="cmId" elementId="newcontent_editor" [draftExtraParams]="editorExtraParams"> |                     elementId="newcontent_editor" [draftExtraParams]="editorExtraParams"> | ||||||
|                 </core-rich-text-editor> |                 </core-rich-text-editor> | ||||||
|             </ion-item> |             </ion-item> | ||||||
| 
 | 
 | ||||||
|             <ion-item *ngIf="wrongVersionLock" class="ion-text-center addon-mod_wiki-wrongversionlock" > |             <ion-item *ngIf="wrongVersionLock" class="ion-text-center addon-mod_wiki-wrongversionlock"> | ||||||
|                 <ion-label> |                 <ion-label> | ||||||
|                     <ion-badge color="danger" class="ion-padding">{{ 'addon.mod_wiki.wrongversionlock' | translate }}</ion-badge> |                     <ion-badge color="danger" class="ion-padding">{{ 'addon.mod_wiki.wrongversionlock' | translate }}</ion-badge> | ||||||
|                 </ion-label> |                 </ion-label> | ||||||
|  | |||||||
| @ -3,14 +3,16 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1> |             <h1> | ||||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> |                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> | ||||||
|                 </core-format-text> |                 </core-format-text> | ||||||
|             </h1> |             </h1> | ||||||
|         <p> |             <h2> | ||||||
|                 <core-format-text [text]="pageTitle" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> |                 <core-format-text [text]="pageTitle" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> | ||||||
|                 </core-format-text> |                 </core-format-text> | ||||||
|         </p> |             </h2> | ||||||
|  |         </ion-title> | ||||||
| 
 | 
 | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <!-- The buttons defined by the component will be added in here. --> |             <!-- The buttons defined by the component will be added in here. --> | ||||||
|  | |||||||
| @ -1,9 +1,8 @@ | |||||||
| <ion-header> | <ion-header> | ||||||
|     <ion-toolbar> |     <ion-toolbar> | ||||||
|         <ion-buttons slot="start"> |         <ion-title> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |  | ||||||
|         </ion-buttons> |  | ||||||
|             <h2>{{ 'addon.mod_workshop.userplan' | translate }}</h2> |             <h2>{{ 'addon.mod_workshop.userplan' | translate }}</h2> | ||||||
|  |         </ion-title> | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate"> |             <ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate"> | ||||||
|                 <ion-icon name="fas-times" slot="icon-only" aria-hidden=true></ion-icon> |                 <ion-icon name="fas-times" slot="icon-only" aria-hidden=true></ion-icon> | ||||||
| @ -30,8 +29,8 @@ | |||||||
|                 <ion-icon slot="end" name="fas-external-link-alt" aria-hidden="true"></ion-icon> |                 <ion-icon slot="end" name="fas-external-link-alt" aria-hidden="true"></ion-icon> | ||||||
|             </ion-item> |             </ion-item> | ||||||
|             <ion-item class="ion-text-wrap" *ngFor="let task of phase.tasks" |             <ion-item class="ion-text-wrap" *ngFor="let task of phase.tasks" | ||||||
|                 [class.item-dimmed]="phase.code != workshopPhase || (task.code == 'submit' && !showSubmit)" |                 [class.item-dimmed]="phase.code != workshopPhase || (task.code == 'submit' && !showSubmit)" (click)="runTask(task)" | ||||||
|                 (click)="runTask(task)" detail="false" button> |                 detail="false" button> | ||||||
|                 <ion-icon slot="start" name="far-circle" *ngIf="task.completed == null" |                 <ion-icon slot="start" name="far-circle" *ngIf="task.completed == null" | ||||||
|                     [attr.aria-label]="'addon.mod_workshop.tasktodo' | translate"></ion-icon> |                     [attr.aria-label]="'addon.mod_workshop.tasktodo' | translate"></ion-icon> | ||||||
|                 <ion-icon slot="start" name="fas-times-circle" color="danger" *ngIf="task.completed == ''" |                 <ion-icon slot="start" name="fas-times-circle" color="danger" *ngIf="task.completed == ''" | ||||||
|  | |||||||
| @ -3,11 +3,13 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1> |             <h1> | ||||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="workshop && workshop.coursemodule" |                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="workshop && workshop.coursemodule" | ||||||
|                     [courseId]="courseId"> |                     [courseId]="courseId"> | ||||||
|                 </core-format-text> |                 </core-format-text> | ||||||
|             </h1> |             </h1> | ||||||
|  |         </ion-title> | ||||||
|         <ion-buttons slot="end" [hidden]="!evaluating"> |         <ion-buttons slot="end" [hidden]="!evaluating"> | ||||||
|             <ion-button fill="clear" (click)="saveEvaluation()"> |             <ion-button fill="clear" (click)="saveEvaluation()"> | ||||||
|                 {{ 'core.save' | translate }} |                 {{ 'core.save' | translate }} | ||||||
| @ -48,14 +50,15 @@ | |||||||
|             </ion-label> |             </ion-label> | ||||||
|         </ion-item> |         </ion-item> | ||||||
| 
 | 
 | ||||||
|         <addon-mod-workshop-assessment-strategy |         <addon-mod-workshop-assessment-strategy *ngIf="assessment && assessmentId && showGrade(assessment.grade) && workshop && access" | ||||||
|             *ngIf="assessment && assessmentId && showGrade(assessment.grade) && workshop && access" [workshop]="workshop" |             [workshop]="workshop" [access]="access" [assessmentId]="assessmentId" [userId]="profile && profile.id" [strategy]="strategy"> | ||||||
|             [access]="access" [assessmentId]="assessmentId" [userId]="profile && profile.id" [strategy]="strategy"> |  | ||||||
|         </addon-mod-workshop-assessment-strategy> |         </addon-mod-workshop-assessment-strategy> | ||||||
| 
 | 
 | ||||||
|         <form [formGroup]="evaluateForm" *ngIf="evaluating" #evaluateFormEl> |         <form [formGroup]="evaluateForm" *ngIf="evaluating" #evaluateFormEl> | ||||||
|             <ion-item class="ion-text-wrap"> |             <ion-item class="ion-text-wrap"> | ||||||
|                 <ion-label><h2>{{ 'addon.mod_workshop.assessmentsettings' | translate }}</h2></ion-label> |                 <ion-label> | ||||||
|  |                     <h2>{{ 'addon.mod_workshop.assessmentsettings' | translate }}</h2> | ||||||
|  |                 </ion-label> | ||||||
|             </ion-item> |             </ion-item> | ||||||
|             <ion-item class="ion-text-wrap" *ngIf="access?.canallocate"> |             <ion-item class="ion-text-wrap" *ngIf="access?.canallocate"> | ||||||
|                 <ion-label position="stacked"> |                 <ion-label position="stacked"> | ||||||
| @ -85,16 +88,16 @@ | |||||||
|             </ion-item> |             </ion-item> | ||||||
|             <ion-item *ngIf="access?.canoverridegrades"> |             <ion-item *ngIf="access?.canoverridegrades"> | ||||||
|                 <ion-label position="stacked">{{ 'addon.mod_workshop.feedbackreviewer' | translate }}</ion-label> |                 <ion-label position="stacked">{{ 'addon.mod_workshop.feedbackreviewer' | translate }}</ion-label> | ||||||
|                 <core-rich-text-editor [control]="evaluateForm.controls['text']" name="text" |                 <core-rich-text-editor [control]="evaluateForm.controls['text']" name="text" [autoSave]="true" contextLevel="module" | ||||||
|                     [autoSave]="true" contextLevel="module" [contextInstanceId]="workshop?.coursemodule" |                     [contextInstanceId]="workshop?.coursemodule" elementId="feedbackreviewer_editor" | ||||||
|                     elementId="feedbackreviewer_editor" [draftExtraParams]="{asid: assessmentId}"> |                     [draftExtraParams]="{asid: assessmentId}"> | ||||||
|                 </core-rich-text-editor> |                 </core-rich-text-editor> | ||||||
|             </ion-item> |             </ion-item> | ||||||
|         </form> |         </form> | ||||||
|         <ion-list *ngIf="!evaluating && evaluate && evaluate.text"> |         <ion-list *ngIf="!evaluating && evaluate && evaluate.text"> | ||||||
|             <ion-item class="ion-text-wrap"> |             <ion-item class="ion-text-wrap"> | ||||||
|                 <core-user-avatar *ngIf="evaluateByProfile" [user]="evaluateByProfile" slot="start" |                 <core-user-avatar *ngIf="evaluateByProfile" [user]="evaluateByProfile" slot="start" [courseId]="courseId" | ||||||
|                     [courseId]="courseId" [userId]="evaluateByProfile.id"></core-user-avatar> |                     [userId]="evaluateByProfile.id"></core-user-avatar> | ||||||
|                 <ion-label> |                 <ion-label> | ||||||
|                     <h2 *ngIf="evaluateByProfile && evaluateByProfile.fullname"> |                     <h2 *ngIf="evaluateByProfile && evaluateByProfile.fullname"> | ||||||
|                         {{ 'addon.mod_workshop.feedbackby' | translate : {$a: evaluateByProfile.fullname} }} |                         {{ 'addon.mod_workshop.feedbackby' | translate : {$a: evaluateByProfile.fullname} }} | ||||||
|  | |||||||
| @ -3,7 +3,9 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1>{{ 'addon.mod_workshop.editsubmission' | translate }}</h1> |             <h1>{{ 'addon.mod_workshop.editsubmission' | translate }}</h1> | ||||||
|  |         </ion-title> | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <ion-button fill="clear" (click)="save()" [attr.aria-label]="'core.save' | translate"> |             <ion-button fill="clear" (click)="save()" [attr.aria-label]="'core.save' | translate"> | ||||||
|                 {{ 'core.save' | translate }} |                 {{ 'core.save' | translate }} | ||||||
| @ -38,9 +40,8 @@ | |||||||
|             </ion-item> |             </ion-item> | ||||||
| 
 | 
 | ||||||
|             <core-attachments *ngIf="fileAvailable" [files]="attachments" [maxSize]="workshop.maxbytes" |             <core-attachments *ngIf="fileAvailable" [files]="attachments" [maxSize]="workshop.maxbytes" | ||||||
|                 [maxSubmissions]="workshop.nattachments" [component]="component" [componentId]="workshop.coursemodule" |                 [maxSubmissions]="workshop.nattachments" [component]="component" [componentId]="workshop.coursemodule" allowOffline="true" | ||||||
|                 allowOffline="true" [acceptedTypes]="workshop.submissionfiletypes" [required]="fileRequired" |                 [acceptedTypes]="workshop.submissionfiletypes" [required]="fileRequired" [courseId]="workshop.course"> | ||||||
|                 [courseId]="workshop.course"> |  | ||||||
|             </core-attachments> |             </core-attachments> | ||||||
|         </form> |         </form> | ||||||
|     </core-loading> |     </core-loading> | ||||||
|  | |||||||
| @ -3,10 +3,12 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1> |             <h1> | ||||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId"> |                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId"> | ||||||
|                 </core-format-text> |                 </core-format-text> | ||||||
|             </h1> |             </h1> | ||||||
|  |         </ion-title> | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <!-- The buttons defined by the component will be added in here. --> |             <!-- The buttons defined by the component will be added in here. --> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  | |||||||
| @ -3,10 +3,12 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1> |             <h1> | ||||||
|                 <core-format-text *ngIf="title" [text]="title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId"> |                 <core-format-text *ngIf="title" [text]="title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId"> | ||||||
|                 </core-format-text> |                 </core-format-text> | ||||||
|             </h1> |             </h1> | ||||||
|  |         </ion-title> | ||||||
|         <ion-buttons slot="end" [hidden]="!loaded"> |         <ion-buttons slot="end" [hidden]="!loaded"> | ||||||
|             <ion-button *ngIf="assessmentId && access.assessingallowed" fill="clear" (click)="saveAssessment()" |             <ion-button *ngIf="assessmentId && access.assessingallowed" fill="clear" (click)="saveAssessment()" | ||||||
|                 [attr.aria-label]="'core.save' | translate"> |                 [attr.aria-label]="'core.save' | translate"> | ||||||
| @ -55,8 +57,7 @@ | |||||||
|                     <h2 *ngIf="evaluateByProfile && evaluateByProfile.fullname"> |                     <h2 *ngIf="evaluateByProfile && evaluateByProfile.fullname"> | ||||||
|                         {{ 'addon.mod_workshop.feedbackby' | translate : {$a: evaluateByProfile.fullname} }} |                         {{ 'addon.mod_workshop.feedbackby' | translate : {$a: evaluateByProfile.fullname} }} | ||||||
|                     </h2> |                     </h2> | ||||||
|                     <core-format-text [text]="evaluate?.text" contextLevel="module" [contextInstanceId]="module.id" |                     <core-format-text [text]="evaluate?.text" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId"> | ||||||
|                         [courseId]="courseId"> |  | ||||||
|                     </core-format-text> |                     </core-format-text> | ||||||
|                 </ion-label> |                 </ion-label> | ||||||
|             </ion-item> |             </ion-item> | ||||||
| @ -68,8 +69,8 @@ | |||||||
|                     <h2>{{ 'addon.mod_workshop.yourassessment' | translate }}</h2> |                     <h2>{{ 'addon.mod_workshop.yourassessment' | translate }}</h2> | ||||||
|                 </ion-label> |                 </ion-label> | ||||||
|             </ion-item> |             </ion-item> | ||||||
|             <addon-mod-workshop-assessment [submission]="submission" [assessment]="ownAssessment" [courseId]="courseId" |             <addon-mod-workshop-assessment [submission]="submission" [assessment]="ownAssessment" [courseId]="courseId" [access]="access" | ||||||
|                 [access]="access" [module]="module" [workshop]="workshop"> |                 [module]="module" [workshop]="workshop"> | ||||||
|             </addon-mod-workshop-assessment> |             </addon-mod-workshop-assessment> | ||||||
|         </ion-list> |         </ion-list> | ||||||
| 
 | 
 | ||||||
| @ -92,8 +93,8 @@ | |||||||
|                     <h2>{{ 'addon.mod_workshop.givengrades' | translate }}</h2> |                     <h2>{{ 'addon.mod_workshop.givengrades' | translate }}</h2> | ||||||
|                 </ion-label> |                 </ion-label> | ||||||
|             </ion-item> |             </ion-item> | ||||||
|             <addon-mod-workshop-assessment *ngFor="let reviewer of submissionInfo.reviewerof" [assessment]="reviewer" |             <addon-mod-workshop-assessment *ngFor="let reviewer of submissionInfo.reviewerof" [assessment]="reviewer" [courseId]="courseId" | ||||||
|                 [courseId]="courseId" [module]="module" [workshop]="workshop" [access]="access"> |                 [module]="module" [workshop]="workshop" [access]="access"> | ||||||
|             </addon-mod-workshop-assessment> |             </addon-mod-workshop-assessment> | ||||||
|         </ion-list> |         </ion-list> | ||||||
| 
 | 
 | ||||||
| @ -126,21 +127,20 @@ | |||||||
|             </ion-item> |             </ion-item> | ||||||
|             <ion-item> |             <ion-item> | ||||||
|                 <ion-label position="stacked">{{ 'addon.mod_workshop.feedbackauthor' | translate }}</ion-label> |                 <ion-label position="stacked">{{ 'addon.mod_workshop.feedbackauthor' | translate }}</ion-label> | ||||||
|                 <core-rich-text-editor [control]="feedbackForm.controls['text']" name="text" |                 <core-rich-text-editor [control]="feedbackForm.controls['text']" name="text" [autoSave]="true" contextLevel="module" | ||||||
|                     [autoSave]="true" contextLevel="module" [contextInstanceId]="module.id" elementId="feedbackauthor_editor" |                     [contextInstanceId]="module.id" elementId="feedbackauthor_editor" [draftExtraParams]="{id: submissionId}"> | ||||||
|                     [draftExtraParams]="{id: submissionId}"> |  | ||||||
|                 </core-rich-text-editor> |                 </core-rich-text-editor> | ||||||
|             </ion-item> |             </ion-item> | ||||||
|         </form> |         </form> | ||||||
| 
 | 
 | ||||||
|         <addon-mod-workshop-assessment-strategy *ngIf="assessmentId" [workshop]="workshop" [access]="access" |         <addon-mod-workshop-assessment-strategy *ngIf="assessmentId" [workshop]="workshop" [access]="access" [assessmentId]="assessmentId" | ||||||
|             [assessmentId]="assessmentId" [userId]="assessmentUserId" [strategy]="strategy" [edit]="access.assessingallowed"> |             [userId]="assessmentUserId" [strategy]="strategy" [edit]="access.assessingallowed"> | ||||||
|         </addon-mod-workshop-assessment-strategy> |         </addon-mod-workshop-assessment-strategy> | ||||||
| 
 | 
 | ||||||
|         <ion-list *ngIf="assessmentId && !access.assessingallowed && assessment?.feedbackreviewer"> |         <ion-list *ngIf="assessmentId && !access.assessingallowed && assessment?.feedbackreviewer"> | ||||||
|             <ion-item class="ion-text-wrap"> |             <ion-item class="ion-text-wrap"> | ||||||
|                 <core-user-avatar *ngIf="evaluateGradingByProfile" [user]="evaluateGradingByProfile" slot="start" |                 <core-user-avatar *ngIf="evaluateGradingByProfile" [user]="evaluateGradingByProfile" slot="start" [courseId]="courseId" | ||||||
|                     [courseId]="courseId" [userId]="evaluateGradingByProfile.id"></core-user-avatar> |                     [userId]="evaluateGradingByProfile.id"></core-user-avatar> | ||||||
|                 <ion-label> |                 <ion-label> | ||||||
|                     <h2 *ngIf="evaluateGradingByProfile && evaluateGradingByProfile.fullname"> |                     <h2 *ngIf="evaluateGradingByProfile && evaluateGradingByProfile.fullname"> | ||||||
|                         {{ 'addon.mod_workshop.feedbackby' | translate : {$a: evaluateGradingByProfile.fullname} }} |                         {{ 'addon.mod_workshop.feedbackby' | translate : {$a: evaluateGradingByProfile.fullname} }} | ||||||
|  | |||||||
| @ -1,6 +1,8 @@ | |||||||
| <ion-header> | <ion-header> | ||||||
|     <ion-toolbar> |     <ion-toolbar> | ||||||
|  |         <ion-title> | ||||||
|             <h2>{{ 'addon.notes.addnewnote' | translate }}</h2> |             <h2>{{ 'addon.notes.addnewnote' | translate }}</h2> | ||||||
|  |         </ion-title> | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate"> |             <ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate"> | ||||||
|                 <ion-icon name="fas-times" slot="icon-only" aria-hidden=true></ion-icon> |                 <ion-icon name="fas-times" slot="icon-only" aria-hidden=true></ion-icon> | ||||||
| @ -20,8 +22,7 @@ | |||||||
|         </ion-item> |         </ion-item> | ||||||
|         <ion-item> |         <ion-item> | ||||||
|             <ion-label class="sr-only">{{ 'addon.notes.note' | translate }}</ion-label> |             <ion-label class="sr-only">{{ 'addon.notes.note' | translate }}</ion-label> | ||||||
|             <ion-textarea placeholder="{{ 'addon.notes.note' | translate }}" rows="5" [(ngModel)]="text" name="text" |             <ion-textarea placeholder="{{ 'addon.notes.note' | translate }}" rows="5" [(ngModel)]="text" name="text" required="required"> | ||||||
|                 required="required"> |  | ||||||
|             </ion-textarea> |             </ion-textarea> | ||||||
|         </ion-item> |         </ion-item> | ||||||
|         <div class="ion-padding"> |         <div class="ion-padding"> | ||||||
|  | |||||||
| @ -4,7 +4,9 @@ | |||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
| 
 | 
 | ||||||
|  |         <ion-title> | ||||||
|             <h1>{{ 'addon.notes.notes' | translate }}</h1> |             <h1>{{ 'addon.notes.notes' | translate }}</h1> | ||||||
|  |         </ion-title> | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| @ -15,13 +17,12 @@ | |||||||
|         <ion-icon name="fas-pen" slot="icon-only" aria-hidden="true"></ion-icon> |         <ion-icon name="fas-pen" slot="icon-only" aria-hidden="true"></ion-icon> | ||||||
|     </ion-button> |     </ion-button> | ||||||
|     <core-context-menu> |     <core-context-menu> | ||||||
|         <core-context-menu-item [hidden]="!(notesLoaded && !hasOffline)" [priority]="100" |         <core-context-menu-item [hidden]="!(notesLoaded && !hasOffline)" [priority]="100" [content]="'core.refresh' | translate" | ||||||
|             [content]="'core.refresh' | translate" (action)="refreshNotes(false)" |             (action)="refreshNotes(false)" [iconAction]="refreshIcon" [closeOnClick]="true"> | ||||||
|             [iconAction]="refreshIcon" [closeOnClick]="true"> |  | ||||||
|         </core-context-menu-item> |         </core-context-menu-item> | ||||||
|         <core-context-menu-item [hidden]="!(notesLoaded && hasOffline)" [priority]="100" |         <core-context-menu-item [hidden]="!(notesLoaded && hasOffline)" [priority]="100" | ||||||
|             [content]="'core.settings.synchronizenow' | translate" (action)="refreshNotes(true)" |             [content]="'core.settings.synchronizenow' | translate" (action)="refreshNotes(true)" [iconAction]="syncIcon" | ||||||
|             [iconAction]="syncIcon" [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> | ||||||
| @ -32,7 +33,9 @@ | |||||||
|     <core-loading [hideUntil]="notesLoaded"> |     <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><h2>{{user!.fullname}}</h2></ion-label> |             <ion-label> | ||||||
|  |                 <h2>{{user!.fullname}}</h2> | ||||||
|  |             </ion-label> | ||||||
|         </ion-item> |         </ion-item> | ||||||
| 
 | 
 | ||||||
|         <core-combobox [selection]="type" (onChange)="typeChanged($event)"> |         <core-combobox [selection]="type" (onChange)="typeChanged($event)"> | ||||||
| @ -83,14 +86,16 @@ | |||||||
|                         [attr.aria-label]="'core.restore' | translate"> |                         [attr.aria-label]="'core.restore' | translate"> | ||||||
|                         <ion-icon name="fas-undo-alt" slot="icon-only" aria-hidden="true"></ion-icon> |                         <ion-icon name="fas-undo-alt" slot="icon-only" aria-hidden="true"></ion-icon> | ||||||
|                     </ion-button> |                     </ion-button> | ||||||
|                     <ion-button *ngIf="showDelete && !note.deleted && (type != 'personal' || note.usermodified == currentUserId)" |                     <ion-button *ngIf="showDelete && !note.deleted && (type != 'personal' || note.usermodified == currentUserId)" slot="end" | ||||||
|                         slot="end" fill="clear" [@coreSlideInOut]="'fromRight'" color="danger" (click)="deleteNote($event, note)" |                         fill="clear" [@coreSlideInOut]="'fromRight'" color="danger" (click)="deleteNote($event, note)" | ||||||
|                         [attr.aria-label]="'core.delete' | translate"> |                         [attr.aria-label]="'core.delete' | translate"> | ||||||
|                         <ion-icon name="fas-trash" slot="icon-only" aria-hidden="true"></ion-icon> |                         <ion-icon name="fas-trash" slot="icon-only" aria-hidden="true"></ion-icon> | ||||||
|                     </ion-button> |                     </ion-button> | ||||||
|                 </ion-item> |                 </ion-item> | ||||||
|                 <ion-item class="ion-text-wrap"> |                 <ion-item class="ion-text-wrap"> | ||||||
|                     <ion-label><core-format-text [text]="note.content" [filter]="false"></core-format-text></ion-label> |                     <ion-label> | ||||||
|  |                         <core-format-text [text]="note.content" [filter]="false"></core-format-text> | ||||||
|  |                     </ion-label> | ||||||
|                 </ion-item> |                 </ion-item> | ||||||
|             </ion-card> |             </ion-card> | ||||||
|         </ng-container> |         </ng-container> | ||||||
|  | |||||||
| @ -3,7 +3,9 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1>{{ 'addon.notifications.notifications' | translate }}</h1> |             <h1>{{ 'addon.notifications.notifications' | translate }}</h1> | ||||||
|  |         </ion-title> | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <core-user-menu-button></core-user-menu-button> |             <core-user-menu-button></core-user-menu-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
| @ -15,8 +17,7 @@ | |||||||
|     </ion-refresher> |     </ion-refresher> | ||||||
|     <core-loading [hideUntil]="notificationsLoaded"> |     <core-loading [hideUntil]="notificationsLoaded"> | ||||||
|         <div class="ion-padding" *ngIf="canMarkAllNotificationsAsRead"> |         <div class="ion-padding" *ngIf="canMarkAllNotificationsAsRead"> | ||||||
|             <ion-button [disabled]="loadingMarkAllNotificationsAsRead" expand="block" (click)="markAllNotificationsAsRead()" |             <ion-button [disabled]="loadingMarkAllNotificationsAsRead" expand="block" (click)="markAllNotificationsAsRead()" color="light"> | ||||||
|                 color="light"> |  | ||||||
|                 <ion-icon slot="start" name="fas-check" aria-hidden="true" *ngIf="!loadingMarkAllNotificationsAsRead"></ion-icon> |                 <ion-icon slot="start" name="fas-check" aria-hidden="true" *ngIf="!loadingMarkAllNotificationsAsRead"></ion-icon> | ||||||
|                 <ion-spinner slot="start" [attr.aria-label]="'core.loading' | translate" *ngIf="loadingMarkAllNotificationsAsRead"> |                 <ion-spinner slot="start" [attr.aria-label]="'core.loading' | translate" *ngIf="loadingMarkAllNotificationsAsRead"> | ||||||
|                 </ion-spinner> |                 </ion-spinner> | ||||||
| @ -25,8 +26,7 @@ | |||||||
|         </div> |         </div> | ||||||
| 
 | 
 | ||||||
|         <ion-card *ngFor="let notification of notifications"> |         <ion-card *ngFor="let notification of notifications"> | ||||||
|             <ion-item class="ion-text-wrap" lines="none" |             <ion-item class="ion-text-wrap" lines="none" [attr.aria-label]=" | ||||||
|                 [attr.aria-label]=" |  | ||||||
|                     notification.timeread |                     notification.timeread | ||||||
|                     ? notification.subject |                     ? notification.subject | ||||||
|                     : 'addon.notifications.unreadnotification' | translate: {$a: notification.subject}"> |                     : 'addon.notifications.unreadnotification' | translate: {$a: notification.subject}"> | ||||||
| @ -34,8 +34,8 @@ | |||||||
|                     [profileUrl]="notification.profileimageurlfrom" [fullname]="notification.userfromfullname" |                     [profileUrl]="notification.profileimageurlfrom" [fullname]="notification.userfromfullname" | ||||||
|                     [userId]="notification.useridfrom" [extraIcon]="notification.iconurl"></core-user-avatar> |                     [userId]="notification.useridfrom" [extraIcon]="notification.iconurl"></core-user-avatar> | ||||||
| 
 | 
 | ||||||
|                 <img *ngIf="notification.useridfrom <= 0 && notification.iconurl" [src]="notification.iconurl" alt="" |                 <img *ngIf="notification.useridfrom <= 0 && notification.iconurl" [src]="notification.iconurl" alt="" role="presentation" | ||||||
|                     role="presentation" class="core-notification-icon" slot="start"> |                     class="core-notification-icon" slot="start"> | ||||||
| 
 | 
 | ||||||
|                 <ion-label> |                 <ion-label> | ||||||
|                     <p class="item-heading">{{ notification.subject }}</p> |                     <p class="item-heading">{{ notification.subject }}</p> | ||||||
| @ -50,8 +50,8 @@ | |||||||
|             </ion-item> |             </ion-item> | ||||||
|             <ion-item class="ion-text-wrap"> |             <ion-item class="ion-text-wrap"> | ||||||
|                 <ion-label> |                 <ion-label> | ||||||
|                     <core-format-text [text]="notification.mobiletext | coreCreateLinks" contextLevel="system" |                     <core-format-text [text]="notification.mobiletext | coreCreateLinks" contextLevel="system" [contextInstanceId]="0" | ||||||
|                     [contextInstanceId]="0" [maxHeight]="120"> |                         [maxHeight]="120"> | ||||||
|                     </core-format-text> |                     </core-format-text> | ||||||
|                 </ion-label> |                 </ion-label> | ||||||
|             </ion-item> |             </ion-item> | ||||||
|  | |||||||
| @ -3,7 +3,9 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h2>{{ 'addon.notifications.notifications' | translate }}</h2> |             <h2>{{ 'addon.notifications.notifications' | translate }}</h2> | ||||||
|  |         </ion-title> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content> | ||||||
| @ -12,8 +14,7 @@ | |||||||
|             <core-user-avatar *ngIf="userIdFrom > 0" slot="start" [userId]="userIdFrom" [profileUrl]="profileImageUrlFrom" |             <core-user-avatar *ngIf="userIdFrom > 0" slot="start" [userId]="userIdFrom" [profileUrl]="profileImageUrlFrom" | ||||||
|                 [fullname]="userFromFullName" [extraIcon]="iconUrl"></core-user-avatar> |                 [fullname]="userFromFullName" [extraIcon]="iconUrl"></core-user-avatar> | ||||||
| 
 | 
 | ||||||
|             <img *ngIf="userIdFrom <= 0 && iconUrl" [src]="iconUrl" alt="" |             <img *ngIf="userIdFrom <= 0 && iconUrl" [src]="iconUrl" alt="" role="presentation" class="core-notification-icon" slot="start"> | ||||||
|                 role="presentation" class="core-notification-icon" slot="start"> |  | ||||||
| 
 | 
 | ||||||
|             <ion-label> |             <ion-label> | ||||||
|                 <p class="item-heading">{{ subject }}</p> |                 <p class="item-heading">{{ subject }}</p> | ||||||
|  | |||||||
| @ -3,7 +3,9 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1>{{ 'addon.notifications.notifications' | translate }}</h1> |             <h1>{{ 'addon.notifications.notifications' | translate }}</h1> | ||||||
|  |         </ion-title> | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| @ -65,8 +67,7 @@ | |||||||
|                                 !(notification.processorsByName[currentProcessor!.name][state] && |                                 !(notification.processorsByName[currentProcessor!.name][state] && | ||||||
|                                 notification.processorsByName[currentProcessor!.name][state].updating)"> |                                 notification.processorsByName[currentProcessor!.name][state].updating)"> | ||||||
|                             </ion-spinner> |                             </ion-spinner> | ||||||
|                             <ion-toggle |                             <ion-toggle *ngIf="preferences!.enableall && !notification.processorsByName[currentProcessor!.name].locked" | ||||||
|                                 *ngIf="preferences!.enableall && !notification.processorsByName[currentProcessor!.name].locked" |  | ||||||
|                                 [(ngModel)]="notification.processorsByName[currentProcessor!.name][state].checked" |                                 [(ngModel)]="notification.processorsByName[currentProcessor!.name][state].checked" | ||||||
|                                 (ngModelChange)="changePreference(notification, state)" |                                 (ngModelChange)="changePreference(notification, state)" | ||||||
|                                 [disabled]="notification.processorsByName[currentProcessor!.name][state].updating"> |                                 [disabled]="notification.processorsByName[currentProcessor!.name][state].updating"> | ||||||
| @ -88,18 +89,15 @@ | |||||||
|                 <!-- If notifications enabled, show toggles. If disabled, show "Disabled" instead of toggle. --> |                 <!-- If notifications enabled, show toggles. If disabled, show "Disabled" instead of toggle. --> | ||||||
|                 <ion-item *ngFor="let state of ['loggedin', 'loggedoff']" class="ion-text-wrap ion-hide-md-up" lines="none"> |                 <ion-item *ngFor="let state of ['loggedin', 'loggedoff']" class="ion-text-wrap ion-hide-md-up" lines="none"> | ||||||
|                     <ion-label>{{ 'core.settings.' + state | translate }}</ion-label> |                     <ion-label>{{ 'core.settings.' + state | translate }}</ion-label> | ||||||
|                     <ion-spinner slot="end" |                     <ion-spinner slot="end" *ngIf="preferences!.enableall && (notification.processorsByName[currentProcessor!.name][state] && | ||||||
|                         *ngIf="preferences!.enableall && (notification.processorsByName[currentProcessor!.name][state] && |  | ||||||
|                         notification.processorsByName[currentProcessor!.name][state].updating)"> |                         notification.processorsByName[currentProcessor!.name][state].updating)"> | ||||||
|                     </ion-spinner> |                     </ion-spinner> | ||||||
|                     <ion-toggle slot="end" |                     <ion-toggle slot="end" *ngIf="preferences!.enableall && !notification.processorsByName[currentProcessor!.name].locked" | ||||||
|                         *ngIf="preferences!.enableall && !notification.processorsByName[currentProcessor!.name].locked" |  | ||||||
|                         [(ngModel)]="notification.processorsByName[currentProcessor!.name][state].checked" |                         [(ngModel)]="notification.processorsByName[currentProcessor!.name][state].checked" | ||||||
|                         (ngModelChange)="changePreference(notification, state)" |                         (ngModelChange)="changePreference(notification, state)" | ||||||
|                         [disabled]="notification.processorsByName[currentProcessor!.name][state].updating"> |                         [disabled]="notification.processorsByName[currentProcessor!.name][state].updating"> | ||||||
|                     </ion-toggle> |                     </ion-toggle> | ||||||
|                     <span slot="end" |                     <span slot="end" *ngIf="preferences!.enableall && notification.processorsByName[currentProcessor!.name].locked" | ||||||
|                         *ngIf="preferences!.enableall && notification.processorsByName[currentProcessor!.name].locked" |  | ||||||
|                         class="text-gray"> |                         class="text-gray"> | ||||||
|                         {{'core.settings.locked' | translate }} |                         {{'core.settings.locked' | translate }} | ||||||
|                     </span> |                     </span> | ||||||
|  | |||||||
| @ -3,7 +3,9 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1>{{ title }}</h1> |             <h1>{{ title }}</h1> | ||||||
|  |         </ion-title> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content> | ||||||
| @ -25,9 +27,11 @@ | |||||||
| 
 | 
 | ||||||
|         <!-- Display info about space used and space left. --> |         <!-- Display info about space used and space left. --> | ||||||
|         <ion-card class="core-info-card" *ngIf="userQuota && filesInfo && filesInfo.filecount > 0"> |         <ion-card class="core-info-card" *ngIf="userQuota && filesInfo && filesInfo.filecount > 0"> | ||||||
|             <ion-item><ion-label> |             <ion-item> | ||||||
|  |                 <ion-label> | ||||||
|                     {{ 'core.quotausage' | translate:{$a: {used: spaceUsed, total: userQuotaReadable} } }} |                     {{ 'core.quotausage' | translate:{$a: {used: spaceUsed, total: userQuotaReadable} } }} | ||||||
|             </ion-label></ion-item> |                 </ion-label> | ||||||
|  |             </ion-item> | ||||||
|         </ion-card> |         </ion-card> | ||||||
| 
 | 
 | ||||||
|         <!-- List of files. --> |         <!-- List of files. --> | ||||||
|  | |||||||
| @ -3,7 +3,9 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1>{{ 'addon.storagemanager.managestorage' | translate }}</h1> |             <h1>{{ 'addon.storagemanager.managestorage' | translate }}</h1> | ||||||
|  |         </ion-title> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content> | ||||||
| @ -20,8 +22,7 @@ | |||||||
|                     </ion-label> |                     </ion-label> | ||||||
|                     <p slot="end" class="ion-text-end">{{ totalSize | coreBytesToSize }}</p> |                     <p slot="end" class="ion-text-end">{{ totalSize | coreBytesToSize }}</p> | ||||||
|                     <ion-button slot="end" (click)="deleteForCourse()" [disabled]="totalSize == 0"> |                     <ion-button slot="end" (click)="deleteForCourse()" [disabled]="totalSize == 0"> | ||||||
|                         <ion-icon name="fas-trash" slot="icon-only" |                         <ion-icon name="fas-trash" slot="icon-only" [attr.aria-label]="'addon.storagemanager.deletecourse' | translate"> | ||||||
|                             [attr.aria-label]="'addon.storagemanager.deletecourse' | translate"> |  | ||||||
|                         </ion-icon> |                         </ion-icon> | ||||||
|                     </ion-button> |                     </ion-button> | ||||||
|                 </ion-item> |                 </ion-item> | ||||||
| @ -45,8 +46,8 @@ | |||||||
|                 <ion-card-content> |                 <ion-card-content> | ||||||
|                     <ng-container *ngFor="let module of section.modules"> |                     <ng-container *ngFor="let module of section.modules"> | ||||||
|                         <ion-item class="ion-no-padding" *ngIf="module.totalSize! > 0"> |                         <ion-item class="ion-no-padding" *ngIf="module.totalSize! > 0"> | ||||||
|                             <core-mod-icon slot="start" *ngIf="module.handlerData!.icon" |                             <core-mod-icon slot="start" *ngIf="module.handlerData!.icon" [modicon]="module.handlerData!.icon" | ||||||
|                                 [modicon]="module.handlerData!.icon" [modname]="module.modname" [componentId]="module.instance"> |                                 [modname]="module.modname" [componentId]="module.instance"> | ||||||
|                             </core-mod-icon> |                             </core-mod-icon> | ||||||
|                             <ion-label class="ion-text-wrap"> |                             <ion-label class="ion-text-wrap"> | ||||||
|                                 <h3 class="{{module.handlerData!.class}} addon-storagemanager-module-size"> |                                 <h3 class="{{module.handlerData!.class}} addon-storagemanager-module-size"> | ||||||
|  | |||||||
| @ -3,7 +3,9 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1>{{ 'addon.storagemanager.managestorage' | translate }}</h1> |             <h1>{{ 'addon.storagemanager.managestorage' | translate }}</h1> | ||||||
|  |         </ion-title> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-header> | </ion-header> | ||||||
| <ion-content> | <ion-content> | ||||||
| @ -14,12 +16,13 @@ | |||||||
|                 <p class="ion-text-wrap">{{ 'addon.storagemanager.info' | translate }}</p> |                 <p class="ion-text-wrap">{{ 'addon.storagemanager.info' | translate }}</p> | ||||||
|                 <ion-item class="size ion-text-wrap ion-no-padding" lines="none"> |                 <ion-item class="size ion-text-wrap ion-no-padding" lines="none"> | ||||||
|                     <ion-icon name="fas-archive" slot="start" aria-hidden="true"></ion-icon> |                     <ion-icon name="fas-archive" slot="start" aria-hidden="true"></ion-icon> | ||||||
|                     <ion-label><h2 class="ion-text-wrap">{{ 'addon.storagemanager.storageused' | translate }}</h2></ion-label> |                     <ion-label> | ||||||
|  |                         <h2 class="ion-text-wrap">{{ 'addon.storagemanager.storageused' | translate }}</h2> | ||||||
|  |                     </ion-label> | ||||||
|                     <p slot="end" class="ion-text-end">{{ totalSize | coreBytesToSize }}</p> |                     <p slot="end" class="ion-text-end">{{ totalSize | coreBytesToSize }}</p> | ||||||
|                     <ion-button slot="end" (click)="deleteCompletelyDownloadedCourses()" |                     <ion-button slot="end" (click)="deleteCompletelyDownloadedCourses()" | ||||||
|                         [disabled]="completelyDownloadedCourses.length === 0"> |                         [disabled]="completelyDownloadedCourses.length === 0"> | ||||||
|                         <ion-icon name="fas-trash" slot="icon-only" |                         <ion-icon name="fas-trash" slot="icon-only" ariaLabel="{{ 'addon.storagemanager.deletecourses' | translate }}"> | ||||||
|                             ariaLabel="{{ 'addon.storagemanager.deletecourses' | translate }}"> |  | ||||||
|                         </ion-icon> |                         </ion-icon> | ||||||
|                     </ion-button> |                     </ion-button> | ||||||
|                 </ion-item> |                 </ion-item> | ||||||
|  | |||||||
| @ -1,6 +1,8 @@ | |||||||
| <ion-header> | <ion-header> | ||||||
|     <ion-toolbar> |     <ion-toolbar> | ||||||
|         <h1>{{ 'core.block.blocks' | translate }}</h1> |         <ion-title> | ||||||
|  |             <h2>{{ 'core.block.blocks' | translate }}</h2> | ||||||
|  |         </ion-title> | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate"> |             <ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate"> | ||||||
|                 <ion-icon name="fas-times" slot="icon-only" aria-hidden=true></ion-icon> |                 <ion-icon name="fas-times" slot="icon-only" aria-hidden=true></ion-icon> | ||||||
|  | |||||||
| @ -3,19 +3,20 @@ | |||||||
|         <ion-buttons slot="start"> |         <ion-buttons slot="start"> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||||
|         </ion-buttons> |         </ion-buttons> | ||||||
|  |         <ion-title> | ||||||
|             <h1> |             <h1> | ||||||
|                 <core-format-text [text]="title" [contextLevel]="contextLevel" [contextInstanceId]="instanceId" [courseId]="courseId"> |                 <core-format-text [text]="title" [contextLevel]="contextLevel" [contextInstanceId]="instanceId" [courseId]="courseId"> | ||||||
|                 </core-format-text> |                 </core-format-text> | ||||||
|             </h1> |             </h1> | ||||||
|  |         </ion-title> | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <ion-button *ngIf="canDeleteComments" slot="end" fill="clear" (click)="toggleDelete()" |             <ion-button *ngIf="canDeleteComments" slot="end" fill="clear" (click)="toggleDelete()" | ||||||
|                 [attr.aria-label]="'core.toggledelete' | translate"> |                 [attr.aria-label]="'core.toggledelete' | translate"> | ||||||
|                 <ion-icon name="fas-pen" slot="icon-only" aria-hidden="true"></ion-icon> |                 <ion-icon name="fas-pen" slot="icon-only" aria-hidden="true"></ion-icon> | ||||||
|             </ion-button> |             </ion-button> | ||||||
|             <core-context-menu> |             <core-context-menu> | ||||||
|                 <core-context-menu-item [hidden]="!(commentsLoaded && !hasOffline)" [priority]="100" |                 <core-context-menu-item [hidden]="!(commentsLoaded && !hasOffline)" [priority]="100" [content]="'core.refresh' | translate" | ||||||
|                     [content]="'core.refresh' | translate" (action)="refreshComments(false)" [iconAction]="refreshIcon" |                     (action)="refreshComments(false)" [iconAction]="refreshIcon" [closeOnClick]="true"> | ||||||
|                     [closeOnClick]="true"> |  | ||||||
|                 </core-context-menu-item> |                 </core-context-menu-item> | ||||||
|                 <core-context-menu-item [hidden]="!(commentsLoaded && hasOffline)" [priority]="100" |                 <core-context-menu-item [hidden]="!(commentsLoaded && hasOffline)" [priority]="100" | ||||||
|                     [content]="'core.settings.synchronizenow' | translate" (action)="refreshComments(true)" [iconAction]="syncIcon" |                     [content]="'core.settings.synchronizenow' | translate" (action)="refreshComments(true)" [iconAction]="syncIcon" | ||||||
| @ -30,8 +31,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]="commentsLoaded"> |     <core-loading [hideUntil]="commentsLoaded"> | ||||||
|         <core-empty-box *ngIf="!comments || !comments.length" icon="fas-comments" |         <core-empty-box *ngIf="!comments || !comments.length" icon="fas-comments" [message]="'core.comments.nocomments' | translate"> | ||||||
|             [message]="'core.comments.nocomments' | translate"> |  | ||||||
|         </core-empty-box> |         </core-empty-box> | ||||||
| 
 | 
 | ||||||
|         <!-- Load previous messages. --> |         <!-- Load previous messages. --> | ||||||
| @ -45,10 +45,8 @@ | |||||||
|                     {{ comment.timecreated * 1000 | coreFormatDate: "strftimedayshort" }} |                     {{ comment.timecreated * 1000 | coreFormatDate: "strftimedayshort" }} | ||||||
|                 </p> |                 </p> | ||||||
| 
 | 
 | ||||||
|                 <ion-item class="ion-text-wrap addon-message" |                 <ion-item class="ion-text-wrap addon-message" [class.addon-message-mine]="comment.userid == currentUserId" | ||||||
|                     [class.addon-message-mine]="comment.userid == currentUserId" |                     [class.addon-message-not-mine]="comment.userid != currentUserId" [class.addon-message-no-user]="!comment.showUserData" | ||||||
|                     [class.addon-message-not-mine]="comment.userid != currentUserId" |  | ||||||
|                     [class.addon-message-no-user]="!comment.showUserData" |  | ||||||
|                     [@coreSlideInOut]="comment.userid == currentUserId ? '' : 'fromLeft'"> |                     [@coreSlideInOut]="comment.userid == currentUserId ? '' : 'fromLeft'"> | ||||||
|                     <ion-label> |                     <ion-label> | ||||||
|                         <!-- User data. --> |                         <!-- User data. --> | ||||||
| @ -88,10 +86,7 @@ | |||||||
|                 </ion-item> |                 </ion-item> | ||||||
|             </ng-container> |             </ng-container> | ||||||
| 
 | 
 | ||||||
|             <ion-item |             <ion-item *ngIf="offlineComment" class="ion-text-wrap addon-message addon-message-mine"> | ||||||
|                 *ngIf="offlineComment" |  | ||||||
|                 class="ion-text-wrap addon-message addon-message-mine" |  | ||||||
|             > |  | ||||||
|                 <ion-label> |                 <ion-label> | ||||||
|                     <!-- User data. --> |                     <!-- User data. --> | ||||||
|                     <p class="ion-text-center"> |                     <p class="ion-text-center"> | ||||||
| @ -109,9 +104,9 @@ | |||||||
|                     <ion-icon name="fas-clock" aria-hidden="true"></ion-icon> {{ 'core.notsent' | translate }} |                     <ion-icon name="fas-clock" aria-hidden="true"></ion-icon> {{ 'core.notsent' | translate }} | ||||||
|                 </ion-note> |                 </ion-note> | ||||||
|                 <div class="tail"></div> |                 <div class="tail"></div> | ||||||
|                 <ion-button *ngIf="showDelete" slot="end" fill="clear" |                 <ion-button *ngIf="showDelete" slot="end" fill="clear" [@coreSlideInOut]="'fromRight'" color="danger" | ||||||
|                     [@coreSlideInOut]="'fromRight'" color="danger" (click)="deleteComment($event, offlineComment)" |                     (click)="deleteComment($event, offlineComment)" [attr.aria-label]="'core.delete' | translate" | ||||||
|                     [attr.aria-label]="'core.delete' | translate" class="addon-messages-delete-button"> |                     class="addon-messages-delete-button"> | ||||||
|                     <ion-icon name="fas-trash" slot="icon-only" aria-hidden="true"></ion-icon> |                     <ion-icon name="fas-trash" slot="icon-only" aria-hidden="true"></ion-icon> | ||||||
|                 </ion-button> |                 </ion-button> | ||||||
|             </ion-item> |             </ion-item> | ||||||
| @ -121,8 +116,8 @@ | |||||||
| </ion-content> | </ion-content> | ||||||
| <ion-footer class="footer-adjustable" *ngIf="commentsLoaded && canAddComments"> | <ion-footer class="footer-adjustable" *ngIf="commentsLoaded && canAddComments"> | ||||||
|     <ion-toolbar color="contrast"> |     <ion-toolbar color="contrast"> | ||||||
|         <core-send-message-form [sendDisabled]="sending" [message]="newComment" |         <core-send-message-form [sendDisabled]="sending" [message]="newComment" (onSubmit)="addComment($event)" | ||||||
|             (onSubmit)="addComment($event)" [placeholder]="'core.comments.addcomment' | translate"> |             [placeholder]="'core.comments.addcomment' | translate"> | ||||||
|         </core-send-message-form> |         </core-send-message-form> | ||||||
|     </ion-toolbar> |     </ion-toolbar> | ||||||
| </ion-footer> | </ion-footer> | ||||||
|  | |||||||
| @ -1,9 +1,8 @@ | |||||||
| <ion-header> | <ion-header> | ||||||
|     <ion-toolbar> |     <ion-toolbar> | ||||||
|         <ion-buttons slot="start"> |         <ion-title> | ||||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> |  | ||||||
|         </ion-buttons> |  | ||||||
|             <h2>{{ 'core.contentlinks.chooseaccount' | translate }}</h2> |             <h2>{{ 'core.contentlinks.chooseaccount' | translate }}</h2> | ||||||
|  |         </ion-title> | ||||||
|         <ion-buttons slot="end"> |         <ion-buttons slot="end"> | ||||||
|             <ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate"> |             <ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate"> | ||||||
|                 <ion-icon slot="icon-only" name="fas-times" aria-hidden="true"></ion-icon> |                 <ion-icon slot="icon-only" name="fas-times" aria-hidden="true"></ion-icon> | ||||||
| @ -23,12 +22,13 @@ | |||||||
|             <ion-item *ngFor="let site of sites" (click)="siteClicked(site.id)" detail="false" button> |             <ion-item *ngFor="let site of sites" (click)="siteClicked(site.id)" detail="false" button> | ||||||
|                 <ion-avatar slot="start"> |                 <ion-avatar slot="start"> | ||||||
|                     <img [src]="site.avatar" core-external-content [siteId]="site.id" |                     <img [src]="site.avatar" core-external-content [siteId]="site.id" | ||||||
|                         alt="{{ 'core.pictureof' | translate:{$a: site.fullName} }}" |                         alt="{{ 'core.pictureof' | translate:{$a: site.fullName} }}" onError="this.src='assets/img/user-avatar.png'"> | ||||||
|                         onError="this.src='assets/img/user-avatar.png'"> |  | ||||||
|                 </ion-avatar> |                 </ion-avatar> | ||||||
|                 <ion-label> |                 <ion-label> | ||||||
|                     <p class="item-heading">{{site.fullName}}</p> |                     <p class="item-heading">{{site.fullName}}</p> | ||||||
|                     <p><core-format-text [text]="site.siteName" clean="true" [siteId]="site.id"></core-format-text></p> |                     <p> | ||||||
|  |                         <core-format-text [text]="site.siteName" clean="true" [siteId]="site.id"></core-format-text> | ||||||
|  |                     </p> | ||||||
|                     <p>{{site.siteUrl}}</p> |                     <p>{{site.siteUrl}}</p> | ||||||
|                 </ion-label> |                 </ion-label> | ||||||
|             </ion-item> |             </ion-item> | ||||||
|  | |||||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user