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-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1 *ngIf="badge">{{ badge.name }}</h1> | ||||
|         <h1 *ngIf="!badge">{{ 'addon.badges.badges' | translate }}</h1> | ||||
|         <ion-title> | ||||
|             <h1 *ngIf="badge">{{ badge.name }}</h1> | ||||
|             <h1 *ngIf="!badge">{{ 'addon.badges.badges' | translate }}</h1> | ||||
|         </ion-title> | ||||
|     </ion-toolbar> | ||||
| </ion-header> | ||||
| <ion-content> | ||||
| @ -54,8 +56,8 @@ | ||||
|                     <ion-label> | ||||
|                         <h2>{{ 'addon.badges.contact' | translate}}</h2> | ||||
|                         <p><a href="mailto:{{badge.issuercontact}}" core-link auto-login="no" [showBrowserWarning]="false"> | ||||
|                             {{ badge.issuercontact }} | ||||
|                         </a></p> | ||||
|                                 {{ badge.issuercontact }} | ||||
|                             </a></p> | ||||
|                     </ion-label> | ||||
|                 </ion-item> | ||||
|             </ion-item-group> | ||||
| @ -100,8 +102,8 @@ | ||||
|                     <ion-label> | ||||
|                         <h2>{{ 'addon.badges.imageauthoremail' | translate}}</h2> | ||||
|                         <p><a href="mailto:{{badge.imageauthoremail}}" core-link auto-login="no" [showBrowserWarning]="false"> | ||||
|                             {{ badge.imageauthoremail }} | ||||
|                         </a></p> | ||||
|                                 {{ badge.imageauthoremail }} | ||||
|                             </a></p> | ||||
|                     </ion-label> | ||||
|                 </ion-item> | ||||
|                 <ion-item class="ion-text-wrap" *ngIf="badge.imageauthorurl"> | ||||
| @ -157,7 +159,9 @@ | ||||
|             <!-- Endorsement --> | ||||
|             <ion-item-group *ngIf="badge.endorsement"> | ||||
|                 <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 class="ion-text-wrap" *ngIf="badge.endorsement.issuername"> | ||||
|                     <ion-label> | ||||
| @ -169,8 +173,7 @@ | ||||
|                     <ion-label> | ||||
|                         <h2>{{ 'addon.badges.issueremail' | translate}}</h2> | ||||
|                         <p> | ||||
|                             <a href="mailto:{{badge.endorsement.issueremail}}" core-link auto-login="no" | ||||
|                                 [showBrowserWarning]="false"> | ||||
|                             <a href="mailto:{{badge.endorsement.issueremail}}" core-link auto-login="no" [showBrowserWarning]="false"> | ||||
|                                 {{ badge.endorsement.issueremail }} | ||||
|                             </a> | ||||
|                         </p> | ||||
| @ -205,27 +208,39 @@ | ||||
|             <!-- Related badges --> | ||||
|             <ion-item-group *ngIf="badge.relatedbadges"> | ||||
|                 <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 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 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-group> | ||||
| 
 | ||||
|             <!-- Competencies alignment --> | ||||
|             <ion-item-group *ngIf="badge.alignment"> | ||||
|                 <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 class="ion-text-wrap" *ngFor="let alignment of badge.alignment" [href]="alignment.targeturl" core-link | ||||
|                     auto-login="no"> | ||||
|                     <ion-label><h2>{{ alignment.targetname }}</h2></ion-label> | ||||
|                     <ion-label> | ||||
|                         <h2>{{ alignment.targetname }}</h2> | ||||
|                     </ion-label> | ||||
|                 </ion-item> | ||||
|                 <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-group> | ||||
|         </ng-container> | ||||
|  | ||||
| @ -3,7 +3,9 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1>{{ 'addon.badges.badges' | translate }}</h1> | ||||
|         <ion-title> | ||||
|             <h1>{{ 'addon.badges.badges' | translate }}</h1> | ||||
|         </ion-title> | ||||
|     </ion-toolbar> | ||||
| </ion-header> | ||||
| <ion-content> | ||||
| @ -12,8 +14,7 @@ | ||||
|             <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> | ||||
|         </ion-refresher> | ||||
|         <core-loading [hideUntil]="badges.loaded"> | ||||
|             <core-empty-box *ngIf="badges.empty" icon="fas-trophy" | ||||
|                 [message]="'addon.badges.nobadges' | translate"> | ||||
|             <core-empty-box *ngIf="badges.empty" icon="fas-trophy" [message]="'addon.badges.nobadges' | translate"> | ||||
|             </core-empty-box> | ||||
| 
 | ||||
|             <ion-list *ngIf="!badges.empty" class="ion-no-margin"> | ||||
|  | ||||
| @ -3,7 +3,9 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1>{{ title | translate }}</h1> | ||||
|         <ion-title> | ||||
|             <h1>{{ title | translate }}</h1> | ||||
|         </ion-title> | ||||
|         <ion-buttons slot="end"> | ||||
|             <core-user-menu-button></core-user-menu-button> | ||||
|         </ion-buttons> | ||||
| @ -18,8 +20,7 @@ | ||||
|             <ion-label>{{ 'addon.blog.showonlyyourentries' | translate }}</ion-label> | ||||
|             <ion-toggle [(ngModel)]="onlyMyEntries" (ionChange)="onlyMyEntriesToggleChanged(onlyMyEntries)"></ion-toggle> | ||||
|         </ion-item> | ||||
|         <core-empty-box *ngIf="entries && entries.length == 0" icon="far-newspaper" | ||||
|             [message]="'addon.blog.noentriesyet' | translate"> | ||||
|         <core-empty-box *ngIf="entries && entries.length == 0" icon="far-newspaper" [message]="'addon.blog.noentriesyet' | translate"> | ||||
|         </core-empty-box> | ||||
|         <ng-container *ngFor="let entry of entries"> | ||||
|             <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> | ||||
|                     <ion-label> | ||||
|                         <p class="item-heading"> | ||||
|                             <core-format-text [text]="entry.subject" [contextLevel]="contextLevel" | ||||
|                                 [contextInstanceId]="contextInstanceId"> | ||||
|                             <core-format-text [text]="entry.subject" [contextLevel]="contextLevel" [contextInstanceId]="contextInstanceId"> | ||||
|                             </core-format-text> | ||||
|                             <ion-note class="ion-float-end ion-padding-start ion-text-end"> | ||||
|                                 {{ 'addon.blog.' + entry.publishTranslated! | translate}} | ||||
| @ -68,8 +68,8 @@ | ||||
|                 </ion-card-content> | ||||
|                 <div class="ion-text-center ion-margin-bottom" *ngIf="entry.lastmodified > entry.created"> | ||||
|                     <ion-note> | ||||
|                         <ion-icon name="fas-clock" | ||||
|                             [attr.aria-label]="'core.lastmodified' | translate"></ion-icon> {{entry.lastmodified | coreTimeAgo}} | ||||
|                         <ion-icon name="fas-clock" [attr.aria-label]="'core.lastmodified' | translate"></ion-icon> {{entry.lastmodified | | ||||
|                         coreTimeAgo}} | ||||
|                     </ion-note> | ||||
|                 </div> | ||||
|             </ion-card> | ||||
|  | ||||
| @ -1,6 +1,8 @@ | ||||
| <ion-header> | ||||
|     <ion-toolbar> | ||||
|         <h2>{{ 'addon.calendar.reminders' | translate }}</h2> | ||||
|         <ion-title> | ||||
|             <h2>{{ 'addon.calendar.reminders' | translate }}</h2> | ||||
|         </ion-title> | ||||
|         <ion-buttons slot="end"> | ||||
|             <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> | ||||
| @ -36,15 +38,13 @@ | ||||
| 
 | ||||
|             <div class="flex-row"> | ||||
|                 <!-- Input to enter the value. --> | ||||
|                 <ion-input type="number" name="customvalue" [(ngModel)]="customValue" [disabled]="radioValue != 'custom'" | ||||
|                     placeholder="10"> | ||||
|                 <ion-input type="number" name="customvalue" [(ngModel)]="customValue" [disabled]="radioValue != 'custom'" placeholder="10"> | ||||
|                 </ion-input> | ||||
| 
 | ||||
|                 <!-- Units. --> | ||||
|                 <label class="accesshide" for="reminderUnits">{{ 'addon.calendar.units' | translate }}</label> | ||||
|                 <ion-select id="reminderUnits" name="customunits" [(ngModel)]="customUnits" interface="action-sheet" | ||||
|                     [disabled]="radioValue != 'custom'" slot="end" | ||||
|                     [interfaceOptions]="{header: 'addon.calendar.units' | translate}"> | ||||
|                     [disabled]="radioValue != 'custom'" slot="end" [interfaceOptions]="{header: 'addon.calendar.units' | translate}"> | ||||
|                     <ion-select-option *ngFor="let option of customUnitsOptions" [value]="option.value"> | ||||
|                         {{ option.label | translate }} | ||||
|                     </ion-select-option> | ||||
|  | ||||
| @ -3,7 +3,9 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1>{{ 'addon.calendar.calendarevents' | translate }}</h1> | ||||
|         <ion-title> | ||||
|             <h1>{{ 'addon.calendar.calendarevents' | translate }}</h1> | ||||
|         </ion-title> | ||||
|         <ion-buttons slot="end"> | ||||
|             <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> | ||||
| @ -13,8 +15,8 @@ | ||||
|                     iconAction="fas-calendar-day" (action)="goToCurrentDay()"> | ||||
|                 </core-context-menu-item> | ||||
|                 <core-context-menu-item [hidden]="!loaded || !hasOffline || !isOnline" [priority]="400" | ||||
|                     [content]="'core.settings.synchronizenow' | translate" (action)="doRefresh(undefined, $event)" | ||||
|                     [iconAction]="syncIcon" [closeOnClick]="false"> | ||||
|                     [content]="'core.settings.synchronizenow' | translate" (action)="doRefresh(undefined, $event)" [iconAction]="syncIcon" | ||||
|                     [closeOnClick]="false"> | ||||
|                 </core-context-menu-item> | ||||
|             </core-context-menu> | ||||
|         </ion-buttons> | ||||
| @ -60,7 +62,7 @@ | ||||
|         <ion-list *ngIf="filteredEvents && filteredEvents.length" class="ion-no-margin"> | ||||
|             <ng-container *ngFor="let event of filteredEvents"> | ||||
|                 <ion-item class="addon-calendar-event ion-text-wrap" [attr.aria-label]="event.name" (click)="gotoEvent(event.id)" | ||||
|                 [class.item-dimmed]="event.ispast" [ngClass]="['addon-calendar-eventtype-'+event.eventtype]" button detail="true"> | ||||
|                     [class.item-dimmed]="event.ispast" [ngClass]="['addon-calendar-eventtype-'+event.eventtype]" button detail="true"> | ||||
|                     <core-mod-icon *ngIf="event.moduleIcon" [modicon]="event.moduleIcon" slot="start" [showAlt]="false" | ||||
|                         [modname]="event.modname" [componentId]="event.instance"> | ||||
|                     </core-mod-icon> | ||||
| @ -74,7 +76,7 @@ | ||||
|                         </span> | ||||
|                         <p class="item-heading"> | ||||
|                             <core-format-text [text]="event.name" [contextLevel]="event.contextLevel" | ||||
|                             [contextInstanceId]="event.contextInstanceId"></core-format-text> | ||||
|                                 [contextInstanceId]="event.contextInstanceId"></core-format-text> | ||||
|                         </p> | ||||
|                         <p [innerHTML]="event.formattedtime"></p> | ||||
|                     </ion-label> | ||||
|  | ||||
| @ -3,7 +3,9 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1>{{ title | translate }}</h1> | ||||
|         <ion-title> | ||||
|             <h1>{{ title | translate }}</h1> | ||||
|         </ion-title> | ||||
|     </ion-toolbar> | ||||
| </ion-header> | ||||
| <ion-content> | ||||
| @ -40,12 +42,8 @@ | ||||
|                     <p class="item-heading" [core-mark-required]="true">{{ 'addon.calendar.eventkind' | translate }}</p> | ||||
|                 </ion-label> | ||||
|                 <p *ngIf="eventTypes.length == 1" slot="end">{{eventTypes[0].name | translate }}</p> | ||||
|                 <ion-select | ||||
|                     *ngIf="eventTypes.length > 1" | ||||
|                     formControlName="eventtype" | ||||
|                     interface="action-sheet" | ||||
|                     [interfaceOptions]="{header: 'addon.calendar.eventkind' | translate}" | ||||
|                 > | ||||
|                 <ion-select *ngIf="eventTypes.length > 1" formControlName="eventtype" interface="action-sheet" | ||||
|                     [interfaceOptions]="{header: 'addon.calendar.eventkind' | translate}"> | ||||
|                     <ion-select-option *ngFor="let type of eventTypes" [value]="type.value"> | ||||
|                         {{ type.name | translate }} | ||||
|                     </ion-select-option> | ||||
| @ -83,8 +81,7 @@ | ||||
|                     <ion-label> | ||||
|                         <p class="item-heading" [core-mark-required]="true">{{ 'core.course' | translate }}</p> | ||||
|                     </ion-label> | ||||
|                     <ion-select formControlName="groupcourseid" | ||||
|                         interface="action-sheet" [placeholder]="'core.noselection' | translate" | ||||
|                     <ion-select formControlName="groupcourseid" interface="action-sheet" [placeholder]="'core.noselection' | translate" | ||||
|                         (ionChange)="groupCourseSelected()" [interfaceOptions]="{header: 'core.course' | translate}"> | ||||
|                         <ion-select-option *ngFor="let course of courses" [value]="course.id"> | ||||
|                             {{ course.fullname }} | ||||
| @ -93,7 +90,9 @@ | ||||
|                 </ion-item> | ||||
|                 <!-- The course has no groups. --> | ||||
|                 <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> | ||||
|                 <!-- Select the group. --> | ||||
|                 <ion-item class="ion-text-wrap" *ngIf="!loadingGroups && groups.length > 0"> | ||||
| @ -128,8 +127,7 @@ | ||||
|                     <ion-label> | ||||
|                         <p>{{ reminder.label }}</p> | ||||
|                     </ion-label> | ||||
|                     <ion-button fill="clear" (click)="removeReminder(reminder)" [attr.aria-label]="'core.delete' | translate" | ||||
|                         slot="end"> | ||||
|                     <ion-button fill="clear" (click)="removeReminder(reminder)" [attr.aria-label]="'core.delete' | translate" slot="end"> | ||||
|                         <ion-icon name="fas-trash" color="danger" slot="icon-only" aria-hidden="true"></ion-icon> | ||||
|                     </ion-button> | ||||
|                 </ion-item> | ||||
| @ -158,8 +156,7 @@ | ||||
|                     <ion-item *ngIf="form.controls.duration.value === 1"> | ||||
|                         <ion-label position="stacked"></ion-label> | ||||
|                         <ion-datetime formControlName="timedurationuntil" [max]="maxDate" [min]="minDate" | ||||
|                             [placeholder]="'addon.calendar.durationuntil' | translate" | ||||
|                             [displayFormat]="dateFormat" display-timezone="utc"> | ||||
|                             [placeholder]="'addon.calendar.durationuntil' | translate" [displayFormat]="dateFormat" display-timezone="utc"> | ||||
|                         </ion-datetime> | ||||
|                     </ion-item> | ||||
|                     <ion-item lines="none"> | ||||
| @ -171,8 +168,7 @@ | ||||
|                     <ion-item *ngIf="form.controls.duration.value === 2"> | ||||
|                         <ion-label class="sr-only">{{ 'addon.calendar.durationminutes' | translate }}</ion-label> | ||||
|                         <ion-input type="number" name="timedurationminutes" slot="end" | ||||
|                             [placeholder]="'addon.calendar.durationminutes' | translate" | ||||
|                             formControlName="timedurationminutes"></ion-input> | ||||
|                             [placeholder]="'addon.calendar.durationminutes' | translate" formControlName="timedurationminutes"></ion-input> | ||||
|                     </ion-item> | ||||
|                 </ion-radio-group> | ||||
|             </div> | ||||
| @ -223,8 +219,8 @@ | ||||
|                     <p class="item-heading">{{ 'core.description' | translate }}</p> | ||||
|                 </ion-label> | ||||
|                 <core-rich-text-editor [control]="descriptionControl" [attr.aria-label]="'core.description' | translate" | ||||
|                     [placeholder]="'core.description' | translate" name="description" [component]="component" | ||||
|                     [componentId]="eventId" [autoSave]="false"></core-rich-text-editor> | ||||
|                     [placeholder]="'core.description' | translate" name="description" [component]="component" [componentId]="eventId" | ||||
|                     [autoSave]="false"></core-rich-text-editor> | ||||
|             </ion-item> | ||||
| 
 | ||||
|             <!-- Location. --> | ||||
|  | ||||
| @ -3,30 +3,31 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1 *ngIf="event"> | ||||
|             <core-mod-icon *ngIf="event.moduleIcon" [modicon]="event.moduleIcon" [showAlt]="false" | ||||
|                 [modname]="event.modulename" [componentId]="event.instance"></core-mod-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. --> | ||||
|             <span class="sr-only"> | ||||
|                 {{ 'addon.calendar.type' + event.formattedType | translate }} | ||||
|                 <span class="sr-only" *ngIf="event.moduleIcon && event.iconTitle">{{ event.iconTitle }}</span> | ||||
|             </span> | ||||
|             <core-format-text [text]="event.name" [contextLevel]="event.contextLevel" | ||||
|                 [contextInstanceId]="event.contextInstanceId"></core-format-text> | ||||
|         </h1> | ||||
|         <ion-title> | ||||
|             <h1 *ngIf="event"> | ||||
|                 <core-mod-icon *ngIf="event.moduleIcon" [modicon]="event.moduleIcon" [showAlt]="false" [modname]="event.modulename" | ||||
|                     [componentId]="event.instance"></core-mod-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. --> | ||||
|                 <span class="sr-only"> | ||||
|                     {{ 'addon.calendar.type' + event.formattedType | translate }} | ||||
|                     <span class="sr-only" *ngIf="event.moduleIcon && event.iconTitle">{{ event.iconTitle }}</span> | ||||
|                 </span> | ||||
|                 <core-format-text [text]="event.name" [contextLevel]="event.contextLevel" [contextInstanceId]="event.contextInstanceId"> | ||||
|                 </core-format-text> | ||||
|             </h1> | ||||
|         </ion-title> | ||||
|         <ion-buttons slot="end"> | ||||
|             <core-context-menu> | ||||
|                 <core-context-menu-item [hidden]="!eventLoaded || (!hasOffline && event && !event.deleted) || !isOnline" | ||||
|                     [priority]="400" [content]="'core.settings.synchronizenow' | translate" (action)="doRefresh(undefined, $event, true)" | ||||
|                 <core-context-menu-item [hidden]="!eventLoaded || (!hasOffline && event && !event.deleted) || !isOnline" [priority]="400" | ||||
|                     [content]="'core.settings.synchronizenow' | translate" (action)="doRefresh(undefined, $event, true)" | ||||
|                     [iconAction]="syncIcon" [closeOnClick]="false"> | ||||
|                 </core-context-menu-item> | ||||
|                 <core-context-menu-item [hidden]="!event || !event.canedit || event.deleted || (!canEdit && event.id > 0)" | ||||
|                     [priority]="300" [content]="'core.edit' | translate" (action)="openEdit()" iconAction="fas-edit"> | ||||
|                 <core-context-menu-item [hidden]="!event || !event.canedit || event.deleted || (!canEdit && event.id > 0)" [priority]="300" | ||||
|                     [content]="'core.edit' | translate" (action)="openEdit()" iconAction="fas-edit"> | ||||
|                 </core-context-menu-item> | ||||
|                 <core-context-menu-item [hidden]="!event || !event.candelete || event.deleted" [priority]="200" | ||||
|                     [content]="'core.delete' | translate" (action)="deleteEvent()" | ||||
|                     iconAction="fas-trash"></core-context-menu-item> | ||||
|                     [content]="'core.delete' | translate" (action)="deleteEvent()" iconAction="fas-trash"></core-context-menu-item> | ||||
|                 <core-context-menu-item [hidden]="!event || !event.deleted" [priority]="200" [content]="'core.restore' | translate" | ||||
|                     (action)="undoDelete()" iconAction="fas-undo-alt"></core-context-menu-item> | ||||
|             </core-context-menu> | ||||
| @ -52,7 +53,7 @@ | ||||
|                     <ion-label> | ||||
|                         <h2>{{ 'addon.calendar.when' | translate }}</h2> | ||||
|                         <core-format-text [text]="event.formattedtime" [contextLevel]="event.contextLevel" | ||||
|                         [contextInstanceId]="event.contextInstanceId"></core-format-text> | ||||
|                             [contextInstanceId]="event.contextInstanceId"></core-format-text> | ||||
|                     </ion-label> | ||||
|                     <ion-note slot="end" *ngIf="event.deleted"> | ||||
|                         <ion-icon name="fas-trash" aria-hidden="true"></ion-icon> {{ 'core.deletedoffline' | translate }} | ||||
| @ -82,8 +83,10 @@ | ||||
|                 <ion-item class="ion-text-wrap" *ngIf="categoryPath"> | ||||
|                     <ion-label> | ||||
|                         <h2>{{ 'core.category' | translate}}</h2> | ||||
|                         <p><core-format-text [text]="categoryPath" contextLevel="coursecat" | ||||
|                             [contextInstanceId]="event.categoryid"></core-format-text></p> | ||||
|                         <p> | ||||
|                             <core-format-text [text]="categoryPath" contextLevel="coursecat" [contextInstanceId]="event.categoryid"> | ||||
|                             </core-format-text> | ||||
|                         </p> | ||||
|                     </ion-label> | ||||
|                 </ion-item> | ||||
|                 <ion-item class="ion-text-wrap" *ngIf="event.description"> | ||||
| @ -123,13 +126,12 @@ | ||||
|                 </ion-label> | ||||
|             </ion-item> | ||||
|             <ng-container *ngFor="let reminder of reminders"> | ||||
|                 <ion-item *ngIf="reminder.timestamp > 0" class="ion-text-wrap" | ||||
|                     [class.item-dimmed]="reminder.timestamp <= currentTime"> | ||||
|                 <ion-item *ngIf="reminder.timestamp > 0" class="ion-text-wrap" [class.item-dimmed]="reminder.timestamp <= currentTime"> | ||||
|                     <ion-label> | ||||
|                         <p>{{ reminder.label }}</p> | ||||
|                     </ion-label> | ||||
|                     <ion-button fill="clear" (click)="cancelNotification(reminder.id, $event)" | ||||
|                         [attr.aria-label]="'core.delete' | translate" slot="end" *ngIf="reminder.timestamp > currentTime"> | ||||
|                     <ion-button fill="clear" (click)="cancelNotification(reminder.id, $event)" [attr.aria-label]="'core.delete' | translate" | ||||
|                         slot="end" *ngIf="reminder.timestamp > currentTime"> | ||||
|                         <ion-icon name="fas-trash" color="danger" slot="icon-only" aria-hidden="true"></ion-icon> | ||||
|                     </ion-button> | ||||
|                 </ion-item> | ||||
|  | ||||
| @ -3,24 +3,24 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1>{{ (showCalendar ? 'addon.calendar.calendarevents' : 'addon.calendar.upcomingevents') | translate }}</h1> | ||||
|         <ion-title> | ||||
|             <h1>{{ (showCalendar ? 'addon.calendar.calendarevents' : 'addon.calendar.upcomingevents') | translate }}</h1> | ||||
|         </ion-title> | ||||
|         <ion-buttons slot="end"> | ||||
|             <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-button> | ||||
|             <core-context-menu> | ||||
|                 <core-context-menu-item *ngIf="showCalendar" [priority]="800" | ||||
|                 [content]="'addon.calendar.upcomingevents' | translate" iconAction="fas-th-list" | ||||
|                 (action)="toggleDisplay()"></core-context-menu-item> | ||||
|                 <core-context-menu-item *ngIf="!showCalendar" [priority]="800" | ||||
|                 [content]="'addon.calendar.monthlyview' | translate" iconAction="fas-calendar-alt" | ||||
|                 (action)="toggleDisplay()"></core-context-menu-item> | ||||
|                 <core-context-menu-item [hidden]="!notificationsEnabled" [priority]="600" | ||||
|                 [content]="'core.settings.settings' | translate" (action)="openSettings()" iconAction="fas-cogs"> | ||||
|                 <core-context-menu-item *ngIf="showCalendar" [priority]="800" [content]="'addon.calendar.upcomingevents' | translate" | ||||
|                     iconAction="fas-th-list" (action)="toggleDisplay()"></core-context-menu-item> | ||||
|                 <core-context-menu-item *ngIf="!showCalendar" [priority]="800" [content]="'addon.calendar.monthlyview' | translate" | ||||
|                     iconAction="fas-calendar-alt" (action)="toggleDisplay()"></core-context-menu-item> | ||||
|                 <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 [hidden]="!loaded || !hasOffline || !isOnline" [priority]="400" | ||||
|                 [content]="'core.settings.synchronizenow' | translate" (action)="doRefresh(undefined, $event, true)" | ||||
|                 [iconAction]="syncIcon" [closeOnClick]="false"></core-context-menu-item> | ||||
|                     [content]="'core.settings.synchronizenow' | translate" (action)="doRefresh(undefined, $event, true)" | ||||
|                     [iconAction]="syncIcon" [closeOnClick]="false"></core-context-menu-item> | ||||
|             </core-context-menu> | ||||
|             <core-user-menu-button></core-user-menu-button> | ||||
|         </ion-buttons> | ||||
| @ -43,8 +43,7 @@ | ||||
|         [displayNavButtons]="showCalendar" (onEventClicked)="gotoEvent($event)" (onDayClicked)="gotoDay($event)"> | ||||
|     </addon-calendar-calendar> | ||||
| 
 | ||||
|     <addon-calendar-upcoming-events *ngIf="loadUpcoming" [hidden]="showCalendar" [filter]="filter" | ||||
|         (onEventClicked)="gotoEvent($event)"> | ||||
|     <addon-calendar-upcoming-events *ngIf="loadUpcoming" [hidden]="showCalendar" [filter]="filter" (onEventClicked)="gotoEvent($event)"> | ||||
|     </addon-calendar-upcoming-events> | ||||
| 
 | ||||
|     <!-- Create a calendar event. --> | ||||
|  | ||||
| @ -3,7 +3,9 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1>{{ 'core.settings.settings' | translate }}</h1> | ||||
|         <ion-title> | ||||
|             <h1>{{ 'core.settings.settings' | translate }}</h1> | ||||
|         </ion-title> | ||||
|     </ion-toolbar> | ||||
| </ion-header> | ||||
| <ion-content> | ||||
|  | ||||
| @ -3,7 +3,9 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1>{{ title }}</h1> | ||||
|         <ion-title> | ||||
|             <h1>{{ title }}</h1> | ||||
|         </ion-title> | ||||
|     </ion-toolbar> | ||||
| </ion-header> | ||||
| <ion-content> | ||||
|  | ||||
| @ -3,9 +3,11 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1 *ngIf="competency"> | ||||
|             {{ competency.competency.competency.shortname }} <small>{{ competency.competency.competency.idnumber }}</small> | ||||
|         </h1> | ||||
|         <ion-title> | ||||
|             <h1 *ngIf="competency"> | ||||
|                 {{ competency.competency.competency.shortname }} <small>{{ competency.competency.competency.idnumber }}</small> | ||||
|             </h1> | ||||
|         </ion-title> | ||||
|     </ion-toolbar> | ||||
| </ion-header> | ||||
| <ion-content> | ||||
| @ -16,7 +18,9 @@ | ||||
|         <ion-card *ngIf="user"> | ||||
|             <ion-item class="ion-text-wrap"> | ||||
|                 <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-card> | ||||
| 
 | ||||
| @ -32,11 +36,9 @@ | ||||
|                 <ion-label> | ||||
|                     <p class="item-heading">{{ 'addon.competency.path' | translate }}</p> | ||||
|                     <p> | ||||
|                         <a *ngIf="competency.competency.comppath.showlinks" | ||||
|                             [href]="competency.competency.comppath.pluginbaseurl + '/competencies.php?competencyframeworkid=' + | ||||
|                         <a *ngIf="competency.competency.comppath.showlinks" [href]="competency.competency.comppath.pluginbaseurl + '/competencies.php?competencyframeworkid=' + | ||||
|                             competency.competency.comppath.framework.id + '&pagecontextid=' + | ||||
|                             competency.competency.comppath.pagecontextid" | ||||
|                             core-link> | ||||
|                             competency.competency.comppath.pagecontextid" core-link> | ||||
|                             {{ competency.competency.comppath.framework.name }} | ||||
|                         </a> | ||||
|                         <ng-container *ngIf="!competency.competency.comppath.showlinks"> | ||||
| @ -129,7 +131,9 @@ | ||||
|                 </ion-item> | ||||
|                 <ion-item class="ion-text-wrap"> | ||||
|                     <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> | ||||
|                         <blockquote *ngIf="evidence.note">{{ evidence.note }}</blockquote> | ||||
|                     </ion-label> | ||||
|  | ||||
| @ -3,9 +3,11 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1 *ngIf="competency"> | ||||
|             {{ competency.competency.shortname }} <small>{{ competency.competency.idnumber }}</small> | ||||
|         </h1> | ||||
|         <ion-title> | ||||
|             <h1 *ngIf="competency"> | ||||
|                 {{ competency.competency.shortname }} <small>{{ competency.competency.idnumber }}</small> | ||||
|             </h1> | ||||
|         </ion-title> | ||||
|     </ion-toolbar> | ||||
| </ion-header> | ||||
| <ion-content> | ||||
|  | ||||
| @ -3,7 +3,9 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1>{{ 'addon.competency.coursecompetencies' | translate }}</h1> | ||||
|         <ion-title> | ||||
|             <h1>{{ 'addon.competency.coursecompetencies' | translate }}</h1> | ||||
|         </ion-title> | ||||
|     </ion-toolbar> | ||||
| </ion-header> | ||||
| <ion-content> | ||||
| @ -24,7 +26,7 @@ | ||||
|                 <ion-label> | ||||
|                     <span id="addon-competency-course-{{courseId}}-progress"> | ||||
|                         {{ 'addon.competency.xcompetenciesproficientoutofyincourse' | translate: {$a: | ||||
|                             {x: competencies.statistics.proficientcompetencycount, y: competencies.statistics.competencycount} } }} | ||||
|                         {x: competencies.statistics.proficientcompetencycount, y: competencies.statistics.competencycount} } }} | ||||
|                     </span> | ||||
|                     <core-progress-bar [progress]="competencies.statistics.proficientcompetencypercentage" | ||||
|                         ariaDescribedBy="addon-competency-course-{{courseId}}-progress"> | ||||
| @ -48,13 +50,15 @@ | ||||
|             {{ 'addon.competency.coursecompetencies' | translate }} | ||||
|         </h2> | ||||
|         <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> | ||||
|                <ion-label><h2>{{ user.fullname }}</h2></ion-label> | ||||
|                 <ion-label> | ||||
|                     <h2>{{ user.fullname }}</h2> | ||||
|                 </ion-label> | ||||
|             </ion-item> | ||||
|         </ion-card> | ||||
|         <core-empty-box *ngIf="competencies && competencies.statistics.competencycount == 0" | ||||
|             icon="fas-award" message="{{ 'addon.competency.nocompetenciesincourse' | translate }}"> | ||||
|         <core-empty-box *ngIf="competencies && competencies.statistics.competencycount == 0" icon="fas-award" | ||||
|             message="{{ 'addon.competency.nocompetenciesincourse' | translate }}"> | ||||
|         </core-empty-box> | ||||
| 
 | ||||
|         <div *ngIf="competencies"> | ||||
| @ -81,10 +85,9 @@ | ||||
|                         <div> | ||||
|                             <p class="item-heading">{{ 'addon.competency.path' | translate }}</p> | ||||
|                             <p> | ||||
|                                 <a *ngIf="competency.comppath.showlinks" | ||||
|                                     [href]="competency.comppath.pluginbaseurl + '/competencies.php?competencyframeworkid=' + | ||||
|                                     competency.comppath.framework.id + '&pagecontextid=' + competency.comppath.pagecontextid" | ||||
|                                     core-link [title]="competency.comppath.framework.name"> | ||||
|                                 <a *ngIf="competency.comppath.showlinks" [href]="competency.comppath.pluginbaseurl + '/competencies.php?competencyframeworkid=' + | ||||
|                                     competency.comppath.framework.id + '&pagecontextid=' + competency.comppath.pagecontextid" core-link | ||||
|                                     [title]="competency.comppath.framework.name"> | ||||
|                                     {{ competency.comppath.framework.name }} | ||||
|                                 </a> | ||||
|                                 <ng-container *ngIf="!competency.comppath.showlinks"> | ||||
| @ -103,7 +106,7 @@ | ||||
|                         </div> | ||||
|                         <div *ngIf="competencies.statistics.canmanagecoursecompetencies"> | ||||
|                             <p class="item-heading">{{ 'addon.competency.uponcoursecompletion' | translate }}</p> | ||||
|                              <ng-container *ngFor="let ruleoutcome of competency.ruleoutcomeoptions"> | ||||
|                             <ng-container *ngFor="let ruleoutcome of competency.ruleoutcomeoptions"> | ||||
|                                 <span *ngIf="ruleoutcome.selected">{{ ruleoutcome.text }}</span> | ||||
|                             </ng-container> | ||||
|                         </div> | ||||
| @ -131,8 +134,8 @@ | ||||
|                             <ion-item class="ion-text-wrap" *ngFor="let plan of competency.plans" [href]="plan.url" | ||||
|                                 [attr.aria-label]="plan.name" core-link capture="true"> | ||||
|                                 <ion-label> | ||||
|                                    <core-format-text [text]="plan.name" contextLevel="user" [contextInstanceId]="plan.userid"> | ||||
|                                    </core-format-text> | ||||
|                                     <core-format-text [text]="plan.name" contextLevel="user" [contextInstanceId]="plan.userid"> | ||||
|                                     </core-format-text> | ||||
|                                 </ion-label> | ||||
|                             </ion-item> | ||||
|                         </div> | ||||
|  | ||||
| @ -3,7 +3,9 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1 *ngIf="plan">{{plan.plan.name}}</h1> | ||||
|         <ion-title> | ||||
|             <h1 *ngIf="plan">{{plan.plan.name}}</h1> | ||||
|         </ion-title> | ||||
|     </ion-toolbar> | ||||
| </ion-header> | ||||
| <ion-content> | ||||
| @ -18,14 +20,13 @@ | ||||
|                     <h2>{{ user.fullname }}</h2> | ||||
|                 </ion-label> | ||||
|             </ion-item> | ||||
|        </ion-card> | ||||
|         </ion-card> | ||||
|         <ion-card *ngIf="plan"> | ||||
|             <ion-list> | ||||
|                 <ion-item class="ion-text-wrap" *ngIf="plan.plan.description" lines="none"> | ||||
|                     <ion-label> | ||||
|                         <p> | ||||
|                             <core-format-text [text]="plan.plan.description" contextLevel="user" | ||||
|                                 [contextInstanceId]="plan.plan.userid"> | ||||
|                             <core-format-text [text]="plan.plan.description" contextLevel="user" [contextInstanceId]="plan.plan.userid"> | ||||
|                             </core-format-text> | ||||
|                         </p> | ||||
|                     </ion-label> | ||||
| @ -53,7 +54,7 @@ | ||||
|                         <p class="item-heading">{{ 'addon.competency.progress' | translate }}</p> | ||||
|                         <p> | ||||
|                             {{ 'addon.competency.xcompetenciesproficientoutofy' | translate: | ||||
|                                 {$a: {x: plan.proficientcompetencycount, y: plan.competencycount} } }} | ||||
|                             {$a: {x: plan.proficientcompetencycount, y: plan.competencycount} } }} | ||||
|                         </p> | ||||
|                         <core-progress-bar [progress]="plan.proficientcompetencypercentage" | ||||
|                             [text]="plan.proficientcompetencypercentageformatted" | ||||
| @ -74,15 +75,15 @@ | ||||
|                     </ion-label> | ||||
|                 </ion-item> | ||||
|                 <ion-item class="ion-text-wrap" *ngFor="let competency of plan.competencies" | ||||
|                     (click)="openCompetency(competency.competency.id)" | ||||
|                     [attr.aria-label]="competency.competency.shortname" detail="true" button> | ||||
|                     (click)="openCompetency(competency.competency.id)" [attr.aria-label]="competency.competency.shortname" detail="true" | ||||
|                     button> | ||||
|                     <ion-label> | ||||
|                         <p class="item-heading">{{competency.competency.shortname}} <em>{{competency.competency.idnumber}}</em></p> | ||||
|                     </ion-label> | ||||
|                     <ion-badge *ngIf="competency.usercompetencyplan" slot="end" | ||||
|                         [color]="competency.usercompetencyplan.proficiency ? 'success' : 'danger'"> | ||||
|                             {{ competency.usercompetencyplan.gradename }} | ||||
|                         </ion-badge> | ||||
|                         {{ competency.usercompetencyplan.gradename }} | ||||
|                     </ion-badge> | ||||
|                     <ion-badge *ngIf="!competency.usercompetencyplan" slot="end" | ||||
|                         [color]="competency.usercompetency.proficiency ? 'success' : 'danger'"> | ||||
|                         {{ competency.usercompetency.gradename }} | ||||
|  | ||||
| @ -3,7 +3,9 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1>{{ 'addon.competency.userplans' | translate }}</h1> | ||||
|         <ion-title> | ||||
|             <h1>{{ 'addon.competency.userplans' | translate }}</h1> | ||||
|         </ion-title> | ||||
|     </ion-toolbar> | ||||
| </ion-header> | ||||
| <ion-content> | ||||
| @ -16,8 +18,8 @@ | ||||
| 
 | ||||
|             </core-empty-box> | ||||
|             <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" | ||||
|                     (click)="plans.select(plan)" [attr.aria-current]="plans.getItemAriaCurrent(plan)" button detail="true"> | ||||
|                 <ion-item class="ion-text-wrap" *ngFor="let plan of plans.items" [attr.aria-label]="plan.name" (click)="plans.select(plan)" | ||||
|                     [attr.aria-current]="plans.getItemAriaCurrent(plan)" button detail="true"> | ||||
|                     <ion-label> | ||||
|                         <p class="item-heading">{{ plan.name }}</p> | ||||
|                         <p *ngIf="plan.duedate > 0"> | ||||
| @ -30,4 +32,4 @@ | ||||
|             </ion-list> | ||||
|         </core-loading> | ||||
|     </core-split-view> | ||||
|     </ion-content> | ||||
| </ion-content> | ||||
|  | ||||
| @ -3,7 +3,9 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1>{{ 'addon.coursecompletion.coursecompletion' | translate }}</h1> | ||||
|         <ion-title> | ||||
|             <h1>{{ 'addon.coursecompletion.coursecompletion' | translate }}</h1> | ||||
|         </ion-title> | ||||
|     </ion-toolbar> | ||||
| </ion-header> | ||||
| <ion-content> | ||||
| @ -28,14 +30,18 @@ | ||||
|         </ion-card> | ||||
|         <ion-card *ngIf="completion && tracked"> | ||||
|             <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 class="ion-hide-md-up ion-text-wrap" *ngFor="let criteria of completion.completions"> | ||||
|                 <ion-label> | ||||
|                     <p class="item-heading"> | ||||
|                         <core-format-text clean="true" [text]="criteria.details.criteria" [filter]="false"></core-format-text> | ||||
|                     </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> | ||||
|                 <strong slot="end">{{ criteria.status }}</strong> | ||||
|             </ion-item> | ||||
| @ -73,7 +79,9 @@ | ||||
|         </ion-card> | ||||
|         <ion-card *ngIf="showSelfComplete && tracked"> | ||||
|             <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> | ||||
|                 <ion-label> | ||||
|  | ||||
| @ -3,7 +3,9 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1>{{ 'addon.messageoutput_airnotifier.processorsettingsdesc' | translate }}</h1> | ||||
|         <ion-title> | ||||
|             <h1>{{ 'addon.messageoutput_airnotifier.processorsettingsdesc' | translate }}</h1> | ||||
|         </ion-title> | ||||
|     </ion-toolbar> | ||||
| </ion-header> | ||||
| <ion-content> | ||||
| @ -21,10 +23,7 @@ | ||||
|                     <p>{{ device.platform }} {{ device.version }}</p> | ||||
|                 </ion-label> | ||||
|                 <core-button-with-spinner [loading]="device.updating" slot="end"> | ||||
|                     <ion-toggle | ||||
|                         [(ngModel)]="device.enable" | ||||
|                         (ngModelChange)="enableDevice(device, device.enable)" | ||||
|                     > | ||||
|                     <ion-toggle [(ngModel)]="device.enable" (ngModelChange)="enableDevice(device, device.enable)"> | ||||
|                     </ion-toggle> | ||||
|                 </core-button-with-spinner> | ||||
|             </ion-item> | ||||
|  | ||||
| @ -1,6 +1,8 @@ | ||||
| <ion-header> | ||||
|     <ion-toolbar> | ||||
|         <h2>{{ 'addon.messages.groupinfo' | translate }}</h2> | ||||
|         <ion-title> | ||||
|             <h2>{{ 'addon.messages.groupinfo' | translate }}</h2> | ||||
|         </ion-title> | ||||
|         <ion-buttons slot="end"> | ||||
|             <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> | ||||
| @ -18,7 +20,7 @@ | ||||
|             <ion-label> | ||||
|                 <div class="large-avatar"> | ||||
|                     <img class="avatar" [src]="conversation!.imageurl" core-external-content [alt]="conversation!.name" | ||||
|                     onError="this.src='assets/img/group-avatar.png'"> | ||||
|                         onError="this.src='assets/img/group-avatar.png'"> | ||||
|                 </div> | ||||
|                 <h2> | ||||
|                     <core-format-text [text]="conversation!.name" contextLevel="system" [contextInstanceId]="0"></core-format-text> | ||||
| @ -32,8 +34,8 @@ | ||||
|             </ion-label> | ||||
|         </ion-item> | ||||
| 
 | ||||
|         <ion-item class="ion-text-wrap addon-messages-conversation-item" *ngFor="let member of members" | ||||
|             (click)="closeModal(member.id)" detail="true" button> | ||||
|         <ion-item class="ion-text-wrap addon-messages-conversation-item" *ngFor="let member of members" (click)="closeModal(member.id)" | ||||
|             detail="true" button> | ||||
|             <core-user-avatar [user]="member" [linkProfile]="false" [checkOnline]="member.showonlinestatus" slot="start"> | ||||
|             </core-user-avatar> | ||||
|             <ion-label> | ||||
|  | ||||
| @ -3,7 +3,9 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1>{{ 'addon.messages.contacts' | translate }}</h1> | ||||
|         <ion-title> | ||||
|             <h1>{{ 'addon.messages.contacts' | translate }}</h1> | ||||
|         </ion-title> | ||||
|         <ion-buttons slot="end"> | ||||
|         </ion-buttons> | ||||
|     </ion-toolbar> | ||||
| @ -14,9 +16,8 @@ | ||||
|             <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> | ||||
|         </ion-refresher> | ||||
| 
 | ||||
|         <core-search-box (onSubmit)="search($event)" (onClear)="clearSearch()" | ||||
|             [placeholder]="'addon.messages.contactname' | translate" autocorrect="off" spellcheck="false" lengthCheck="2" | ||||
|             [disabled]="!loaded" searchArea="AddonMessagesContacts"></core-search-box> | ||||
|         <core-search-box (onSubmit)="search($event)" (onClear)="clearSearch()" [placeholder]="'addon.messages.contactname' | translate" | ||||
|             autocorrect="off" spellcheck="false" lengthCheck="2" [disabled]="!loaded" searchArea="AddonMessagesContacts"></core-search-box> | ||||
| 
 | ||||
|         <core-loading [hideUntil]="loaded" [message]="loadingMessage"> | ||||
|             <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"> | ||||
|                 <ng-container *ngIf="contacts[contactType] && (contacts[contactType].length > 0 || contactType === searchType)"> | ||||
|                     <ion-item-divider> | ||||
|                         <ion-label><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-label> | ||||
|                             <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> | ||||
|                     <ng-container *ngFor="let contact of contacts[contactType]"> | ||||
|                         <!-- Don't show deleted users --> | ||||
|                         <ion-item class="ion-text-wrap addon-messages-conversation-item" | ||||
|                             *ngIf="contact.profileimageurl || contact.profileimageurlsmall" | ||||
|                             [attr.aria-label]="contact.fullname" (click)="gotoDiscussion(contact.id)" detail="true" button | ||||
|                             *ngIf="contact.profileimageurl || contact.profileimageurlsmall" [attr.aria-label]="contact.fullname" | ||||
|                             (click)="gotoDiscussion(contact.id)" detail="true" button | ||||
|                             [attr.aria-current]="contact.id == discussionUserId ? 'page' : 'false'"> | ||||
|                             <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> | ||||
|                     </ng-container> | ||||
|                 </ng-container> | ||||
|  | ||||
| @ -3,7 +3,9 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1>{{ 'addon.messages.contacts' | translate }}</h1> | ||||
|         <ion-title> | ||||
|             <h1>{{ 'addon.messages.contacts' | translate }}</h1> | ||||
|         </ion-title> | ||||
|         <ion-buttons slot="end"> | ||||
|             <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> | ||||
| @ -26,8 +28,8 @@ | ||||
|                             <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" | ||||
|                                 [attr.aria-current]="contact.id == selectedUserId ? 'page' : 'false'"> | ||||
|                                 <core-user-avatar slot="start" [user]="contact" | ||||
|                                     [checkOnline]="contact.showonlinestatus" [linkProfile]="false"> | ||||
|                                 <core-user-avatar slot="start" [user]="contact" [checkOnline]="contact.showonlinestatus" | ||||
|                                     [linkProfile]="false"> | ||||
|                                 </core-user-avatar> | ||||
|                                 <ion-label> | ||||
|                                     <p class="item-heading"> | ||||
| @ -45,8 +47,8 @@ | ||||
|                             [message]="'addon.messages.nocontactsgetstarted' | translate"> | ||||
|                         </core-empty-box> | ||||
| 
 | ||||
|                         <core-infinite-loading [enabled]="confirmedCanLoadMore" (action)="loadMore($event)" | ||||
|                             [error]="confirmedLoadMoreError" position="bottom"> | ||||
|                         <core-infinite-loading [enabled]="confirmedCanLoadMore" (action)="loadMore($event)" [error]="confirmedLoadMoreError" | ||||
|                             position="bottom"> | ||||
|                         </core-infinite-loading> | ||||
|                     </core-loading> | ||||
|                 </ng-template> | ||||
| @ -77,8 +79,8 @@ | ||||
|                         <core-empty-box *ngIf="!requests.length" icon="far-address-book" | ||||
|                             [message]="'addon.messages.nocontactrequests' | translate"> | ||||
|                         </core-empty-box> | ||||
|                         <core-infinite-loading [enabled]="requestsCanLoadMore" (action)="loadMore($event)" | ||||
|                             [error]="requestsLoadMoreError" position="bottom"> | ||||
|                         <core-infinite-loading [enabled]="requestsCanLoadMore" (action)="loadMore($event)" [error]="requestsLoadMoreError" | ||||
|                             position="bottom"> | ||||
|                         </core-infinite-loading> | ||||
|                     </core-loading> | ||||
|                 </ng-template> | ||||
|  | ||||
| @ -3,59 +3,56 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1> | ||||
|             <img *ngIf="loaded && !otherMember && conversationImage" class="core-bar-button-image" [src]="conversationImage" | ||||
|                 alt="" onError="this.src='assets/img/group-avatar.png'" core-external-content role="presentation" | ||||
|                 [siteId]="siteId || null"> | ||||
|             <core-user-avatar *ngIf="loaded && otherMember" class="core-bar-button-image" [user]="otherMember" | ||||
|                 [linkProfile]="false" [checkOnline]="otherMember.showonlinestatus"> | ||||
|             </core-user-avatar> | ||||
|             <core-format-text [text]="title" contextLevel="system" [contextInstanceId]="0"></core-format-text> | ||||
|             <ion-icon *ngIf="conversation && conversation.isfavourite" name="fas-star" | ||||
|                 [attr.aria-label]="'core.favourites' | translate"> | ||||
|             </ion-icon> | ||||
|             <ion-icon *ngIf="conversation && conversation.ismuted" name="fas-bell-slash" | ||||
|                 [attr.aria-label]="'addon.messages.mutedconversation' | translate"> | ||||
|             </ion-icon> | ||||
|         </h1> | ||||
|         <ion-title> | ||||
|             <h1> | ||||
|                 <img *ngIf="loaded && !otherMember && conversationImage" class="core-bar-button-image" [src]="conversationImage" alt="" | ||||
|                     onError="this.src='assets/img/group-avatar.png'" core-external-content role="presentation" [siteId]="siteId || null"> | ||||
|                 <core-user-avatar *ngIf="loaded && otherMember" class="core-bar-button-image" [user]="otherMember" [linkProfile]="false" | ||||
|                     [checkOnline]="otherMember.showonlinestatus"> | ||||
|                 </core-user-avatar> | ||||
|                 <core-format-text [text]="title" contextLevel="system" [contextInstanceId]="0"></core-format-text> | ||||
|                 <ion-icon *ngIf="conversation && conversation.isfavourite" name="fas-star" | ||||
|                     [attr.aria-label]="'core.favourites' | translate"> | ||||
|                 </ion-icon> | ||||
|                 <ion-icon *ngIf="conversation && conversation.ismuted" name="fas-bell-slash" | ||||
|                     [attr.aria-label]="'addon.messages.mutedconversation' | translate"> | ||||
|                 </ion-icon> | ||||
|             </h1> | ||||
|         </ion-title> | ||||
|         <ion-buttons slot="end"></ion-buttons> | ||||
|     </ion-toolbar> | ||||
|     <core-navbar-buttons slot="end"> | ||||
|         <core-context-menu [attr.aria-label]="'addon.messages.conversationactions' | translate"> | ||||
|             <core-context-menu-item [hidden]="isSelf || !showInfo || isGroup" [priority]="1000" | ||||
|                 [content]="'addon.messages.info' | translate" (action)="viewInfo()" | ||||
|                 iconAction="fas-info-circle"></core-context-menu-item> | ||||
|                 [content]="'addon.messages.info' | translate" (action)="viewInfo()" iconAction="fas-info-circle"></core-context-menu-item> | ||||
|             <core-context-menu-item [hidden]="isSelf || !showInfo || !isGroup" [priority]="1000" | ||||
|                 [content]="'addon.messages.groupinfo' | translate" (action)="viewInfo()" | ||||
|                 iconAction="fas-info-circle"></core-context-menu-item> | ||||
|             <core-context-menu-item [hidden]="!groupMessagingEnabled || !conversation" [priority]="800" | ||||
|                 [content]="(conversation && conversation.isfavourite ? 'addon.messages.removefromfavourites' : | ||||
|                 'addon.messages.addtofavourites') | translate" | ||||
|                 (action)="changeFavourite($event)" [closeOnClick]="false" [iconAction]="favouriteIcon" | ||||
|                 [iconSlash]="favouriteIconSlash"></core-context-menu-item> | ||||
|                 [content]="'addon.messages.groupinfo' | translate" (action)="viewInfo()" iconAction="fas-info-circle"> | ||||
|             </core-context-menu-item> | ||||
|             <core-context-menu-item [hidden]="!groupMessagingEnabled || !conversation" [priority]="800" [content]="(conversation && conversation.isfavourite ? 'addon.messages.removefromfavourites' : | ||||
|                 'addon.messages.addtofavourites') | translate" (action)="changeFavourite($event)" [closeOnClick]="false" | ||||
|                 [iconAction]="favouriteIcon" [iconSlash]="favouriteIconSlash"></core-context-menu-item> | ||||
|             <core-context-menu-item [hidden]="isSelf || !otherMember || otherMember.isblocked" [priority]="700" | ||||
|                 [content]="'addon.messages.blockuser' | translate" (action)="blockUser()" [iconAction]="blockIcon"> | ||||
|             </core-context-menu-item> | ||||
|             <core-context-menu-item [hidden]="isSelf || !otherMember || !otherMember.isblocked" [priority]="700" | ||||
|                 [content]="'addon.messages.unblockuser' | translate" (action)="unblockUser()" [iconAction]="blockIcon"> | ||||
|             </core-context-menu-item> | ||||
|             <core-context-menu-item [hidden]="isSelf || !muteEnabled || !conversation" [priority]="600" | ||||
|                 [content]="(conversation && conversation.ismuted ? 'addon.messages.unmuteconversation' : | ||||
|             <core-context-menu-item [hidden]="isSelf || !muteEnabled || !conversation" [priority]="600" [content]="(conversation && conversation.ismuted ? 'addon.messages.unmuteconversation' : | ||||
|                 'addon.messages.muteconversation') | translate" (action)="changeMute($event)" [closeOnClick]="false" | ||||
|                 [iconAction]="muteIcon"></core-context-menu-item> | ||||
|             <core-context-menu-item [hidden]="!canDelete || !messages || !messages.length" [priority]="400" | ||||
|                 [content]="'addon.messages.showdeletemessages' | translate" | ||||
|                 iconAction="toggle" [(toggle)]="showDelete"></core-context-menu-item> | ||||
|                 [content]="'addon.messages.showdeletemessages' | translate" iconAction="toggle" [(toggle)]="showDelete"> | ||||
|             </core-context-menu-item> | ||||
|             <core-context-menu-item [hidden]="!groupMessagingEnabled || !conversationId || isGroup || !messages || !messages.length" | ||||
|                 [priority]="200" [content]="'addon.messages.deleteconversation' | translate" (action)="deleteConversation($event)" | ||||
|                 [closeOnClick]="false" [iconAction]="deleteIcon"></core-context-menu-item> | ||||
|             <core-context-menu-item | ||||
|                 [hidden]="isSelf || !otherMember || otherMember.iscontact || requestContactSent || requestContactReceived" | ||||
|                 [priority]="100" [content]="'addon.messages.addtoyourcontacts' | translate" (action)="createContactRequest()" | ||||
|                 [iconAction]="addRemoveIcon"></core-context-menu-item> | ||||
|                 [hidden]="isSelf || !otherMember || otherMember.iscontact || requestContactSent || requestContactReceived" [priority]="100" | ||||
|                 [content]="'addon.messages.addtoyourcontacts' | translate" (action)="createContactRequest()" [iconAction]="addRemoveIcon"> | ||||
|             </core-context-menu-item> | ||||
|             <core-context-menu-item [hidden]="isSelf || !otherMember || !otherMember.iscontact" [priority]="100" | ||||
|                 [content]="'addon.messages.removefromyourcontacts' | translate" (action)="removeContact()" | ||||
|                 [iconAction]="addRemoveIcon" [iconSlash]="true"></core-context-menu-item> | ||||
|                 [content]="'addon.messages.removefromyourcontacts' | translate" (action)="removeContact()" [iconAction]="addRemoveIcon" | ||||
|                 [iconSlash]="true"></core-context-menu-item> | ||||
|         </core-context-menu> | ||||
|     </core-navbar-buttons> | ||||
| </ion-header> | ||||
| @ -72,15 +69,13 @@ | ||||
| 
 | ||||
|         <h2 class="sr-only">{{ title }}</h2> | ||||
| 
 | ||||
|         <ion-list class="addon-messages-discussion-container" [class.addon-messages-discussion-group]="isGroup" | ||||
|             [attr.aria-live]="'polite'"> | ||||
|         <ion-list class="addon-messages-discussion-container" [class.addon-messages-discussion-group]="isGroup" [attr.aria-live]="'polite'"> | ||||
|             <ng-container *ngFor="let message of messages; index as index; last as last"> | ||||
|                 <h3 class="ion-text-center addon-messages-date" *ngIf="message.showDate"> | ||||
|                     {{ message.timecreated | coreFormatDate: "strftimedayshort" }} | ||||
|                 </h3> | ||||
| 
 | ||||
|                 <ion-chip class="addon-messages-unreadfrom" *ngIf="unreadMessageFrom && message.id == unreadMessageFrom" | ||||
|                     color="light"> | ||||
|                 <ion-chip class="addon-messages-unreadfrom" *ngIf="unreadMessageFrom && message.id == unreadMessageFrom" color="light"> | ||||
|                     <ion-label>{{ 'addon.messages.newmessages' | translate }}</ion-label> | ||||
|                     <ion-icon name="fas-arrow-down" aria-hidden="true"></ion-icon> | ||||
|                 </ion-chip> | ||||
| @ -93,8 +88,7 @@ | ||||
|                     <ion-label> | ||||
|                         <!-- User data. --> | ||||
|                         <div *ngIf="message.showUserData" class="item-heading addon-message-user"> | ||||
|                             <core-user-avatar slot="start" [user]="members[message.useridfrom]" [linkProfile]="false" | ||||
|                                 aria-hidden="true"> | ||||
|                             <core-user-avatar slot="start" [user]="members[message.useridfrom]" [linkProfile]="false" aria-hidden="true"> | ||||
|                             </core-user-avatar> | ||||
|                             <div>{{ members[message.useridfrom].fullname }}</div> | ||||
|                         </div> | ||||
|  | ||||
| @ -3,7 +3,9 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1>{{ 'addon.messages.messages' | translate }}</h1> | ||||
|         <ion-title> | ||||
|             <h1>{{ 'addon.messages.messages' | translate }}</h1> | ||||
|         </ion-title> | ||||
|         <ion-buttons slot="end"> | ||||
|             <core-user-menu-button></core-user-menu-button> | ||||
|         </ion-buttons> | ||||
| @ -15,9 +17,9 @@ | ||||
|             <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> | ||||
|         </ion-refresher> | ||||
| 
 | ||||
|         <core-search-box (onSubmit)="searchMessage($event)" (onClear)="clearSearch()" | ||||
|             [placeholder]=" 'addon.messages.message' | translate" autocorrect="off" spellcheck="false" lengthCheck="2" | ||||
|             [disabled]="!loaded" searchArea="AddonMessagesDiscussions" [autoFocus]="false"></core-search-box> | ||||
|         <core-search-box (onSubmit)="searchMessage($event)" (onClear)="clearSearch()" [placeholder]=" 'addon.messages.message' | translate" | ||||
|             autocorrect="off" spellcheck="false" lengthCheck="2" [disabled]="!loaded" searchArea="AddonMessagesDiscussions" | ||||
|             [autoFocus]="false"></core-search-box> | ||||
| 
 | ||||
|         <core-loading [hideUntil]="loaded" [message]="loadingMessage"> | ||||
| 
 | ||||
| @ -26,7 +28,9 @@ | ||||
|                 <ion-item class="ion-text-wrap addon-message-discussion" (click)="gotoContacts()" | ||||
|                     [attr.aria-label]="'addon.messages.contacts' | translate" detail="true" button> | ||||
|                     <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> | ||||
| 
 | ||||
|                 <ng-container *ngIf="search.showResults"> | ||||
| @ -34,7 +38,9 @@ | ||||
|                         <ion-label> | ||||
|                             <h2>{{ 'core.searchresults' | translate }}</h2> | ||||
|                         </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 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)" | ||||
| @ -42,8 +48,10 @@ | ||||
|                         <core-user-avatar [user]="result" slot="start" [checkOnline]="result.showonlinestatus"></core-user-avatar> | ||||
|                         <ion-label> | ||||
|                             <p class="item-heading">{{ result.fullname }}</p> | ||||
|                             <p><core-format-text clean="true" singleLine="true" [text]="result.lastmessage" contextLevel="system" | ||||
|                                 [contextInstanceId]="0"></core-format-text></p> | ||||
|                             <p> | ||||
|                                 <core-format-text clean="true" singleLine="true" [text]="result.lastmessage" contextLevel="system" | ||||
|                                     [contextInstanceId]="0"></core-format-text> | ||||
|                             </p> | ||||
|                         </ion-label> | ||||
|                     </ion-item> | ||||
|                 </ng-container> | ||||
| @ -67,8 +75,8 @@ | ||||
|                                 </ion-note> | ||||
|                             </div> | ||||
|                             <p> | ||||
|                                 <core-format-text clean="true" singleLine="true" [text]="discussion.message!.message" | ||||
|                                     contextLevel="system" [contextInstanceId]="0"> | ||||
|                                 <core-format-text clean="true" singleLine="true" [text]="discussion.message!.message" contextLevel="system" | ||||
|                                     [contextInstanceId]="0"> | ||||
|                                 </core-format-text> | ||||
|                             </p> | ||||
|                         </ion-label> | ||||
|  | ||||
| @ -3,7 +3,9 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1>{{ 'addon.messages.messages' | translate }}</h1> | ||||
|         <ion-title> | ||||
|             <h1>{{ 'addon.messages.messages' | translate }}</h1> | ||||
|         </ion-title> | ||||
|         <ion-buttons slot="end"> | ||||
|             <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> | ||||
| @ -25,28 +27,25 @@ | ||||
|             <ion-list> | ||||
|                 <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-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> | ||||
|                     <span *ngIf="contactRequestsCount > 0" class="sr-only"> | ||||
|                         {{ 'addon.messages.pendingcontactrequests' | translate:{$a: contactRequestsCount} }} | ||||
|                     </span> | ||||
|                 </ion-item> | ||||
|                 <!-- Favourite conversations. --> | ||||
|                 <ion-item | ||||
|                     button | ||||
|                     class="ion-text-wrap divider" | ||||
|                     (click)="toggle(favourites)" | ||||
|                     sticky="true" | ||||
|                 <ion-item button class="ion-text-wrap divider" (click)="toggle(favourites)" sticky="true" | ||||
|                     [attr.aria-label]="(favourites.expanded ? 'core.collapse' : 'core.expand') | translate" | ||||
|                     [attr.aria-expanded]="favourites.expanded" | ||||
|                     aria-controls="addon-messages-groupconversations-favourite" | ||||
|                     role="heading" | ||||
|                     detail="false" | ||||
|                 > | ||||
|                     [attr.aria-expanded]="favourites.expanded" aria-controls="addon-messages-groupconversations-favourite" role="heading" | ||||
|                     detail="false"> | ||||
|                     <ion-icon *ngIf="!favourites.expanded" name="fas-caret-right" flip-rtl 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> | ||||
|                     <span *ngIf="favourites.unread" class="sr-only"> | ||||
|                         {{ 'addon.messages.unreadconversations' | translate:{$a: favourites.unread} }} | ||||
| @ -60,28 +59,26 @@ | ||||
|                     <core-infinite-loading [enabled]="favourites.canLoadMore" (action)="loadMoreConversations(favourites, $event)" | ||||
|                         [error]="favourites.loadMoreError"></core-infinite-loading> | ||||
|                     <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> | ||||
|                 </div> | ||||
|                 <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> | ||||
| 
 | ||||
|                 <!-- Group conversations. --> | ||||
|                 <ion-item | ||||
|                     button | ||||
|                     class="divider ion-text-wrap" | ||||
|                     (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-item button class="divider ion-text-wrap" (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-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> | ||||
|                     <span *ngIf="group.unread" class="sr-only"> | ||||
|                         {{ 'addon.messages.unreadconversations' | translate:{$a: group.unread} }} | ||||
| @ -95,24 +92,21 @@ | ||||
|                     <core-infinite-loading [enabled]="group.canLoadMore" (action)="loadMoreConversations(group, $event)" | ||||
|                         [error]="group.loadMoreError"></core-infinite-loading> | ||||
|                     <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> | ||||
|                 </div> | ||||
|                 <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 | ||||
|                     button | ||||
|                     class="divider ion-text-wrap" | ||||
|                     (click)="toggle(individual)" | ||||
|                     sticky="true" | ||||
|                 <ion-item button class="divider ion-text-wrap" (click)="toggle(individual)" sticky="true" | ||||
|                     [attr.aria-label]="(individual.expanded ? 'core.collapse' : 'core.expand') | translate" | ||||
|                     [attr.aria-expanded]="individual.expanded" | ||||
|                     aria-controls="addon-messages-groupconversations-individual" | ||||
|                     role="heading" | ||||
|                     detail="false" | ||||
|                 > | ||||
|                     [attr.aria-expanded]="individual.expanded" aria-controls="addon-messages-groupconversations-individual" role="heading" | ||||
|                     detail="false"> | ||||
|                     <ion-icon *ngIf="!individual.expanded" name="fas-caret-right" flip-rtl 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)" | ||||
|                         [error]="individual.loadMoreError"></core-infinite-loading> | ||||
|                     <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> | ||||
|                 </div> | ||||
|                 <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-list> | ||||
| @ -147,28 +145,27 @@ | ||||
| <!-- Template to render a list of conversations. --> | ||||
| <ng-template #conversationsTemplate let-conversations="conversations"> | ||||
|     <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-current]="((conversation.id && conversation.id == selectedConversationId) || | ||||
|         [attr.aria-label]="conversation.name" (click)="gotoConversation(conversation.id, conversation.userid)" [attr.aria-current]="((conversation.id && conversation.id == selectedConversationId) || | ||||
|             (conversation.userid && conversation.userid == selectedUserId)) ? 'page': 'false'" | ||||
|         id="addon-message-conversation-{{ conversation.id ? conversation.id : 'user-' + conversation.userid }}"> | ||||
|         <!-- Group conversation image. --> | ||||
|         <ion-avatar slot="start" *ngIf="conversation.type == typeGroup"> | ||||
|             <img [src]="conversation.imageurl" [alt]="conversation.name" core-external-content | ||||
|             onError="this.src='assets/img/group-avatar.png'"> | ||||
|                 onError="this.src='assets/img/group-avatar.png'"> | ||||
|         </ion-avatar> | ||||
| 
 | ||||
|         <!-- Avatar for individual conversations. --> | ||||
|         <core-user-avatar *ngIf="conversation.type != typeGroup" core-user-avatar [user]="conversation.otherUser" | ||||
|             [linkProfile]="false" [checkOnline]="conversation.showonlinestatus" slot="start"></core-user-avatar> | ||||
|         <core-user-avatar *ngIf="conversation.type != typeGroup" core-user-avatar [user]="conversation.otherUser" [linkProfile]="false" | ||||
|             [checkOnline]="conversation.showonlinestatus" slot="start"></core-user-avatar> | ||||
| 
 | ||||
|         <ion-label> | ||||
|             <div class="flex-row ion-justify-content-between"> | ||||
|                 <p class="item-heading"> | ||||
|                     <core-format-text [text]="conversation.name" contextLevel="system" [contextInstanceId]="0"></core-format-text> | ||||
|                     <ion-icon name="fas-user-slash" *ngIf="conversation.isblocked" | ||||
|                         [title]="'addon.messages.contactblocked' | translate"></ion-icon> | ||||
|                     <ion-icon *ngIf="conversation.ismuted" name="fas-volume-mute" | ||||
|                         [title]="'addon.messages.mutedconversation' | translate"></ion-icon> | ||||
|                     <ion-icon name="fas-user-slash" *ngIf="conversation.isblocked" [title]="'addon.messages.contactblocked' | translate"> | ||||
|                     </ion-icon> | ||||
|                     <ion-icon *ngIf="conversation.ismuted" name="fas-volume-mute" [title]="'addon.messages.mutedconversation' | translate"> | ||||
|                     </ion-icon> | ||||
|                 </p> | ||||
|                 <ion-note *ngIf="conversation.lastmessagedate > 0 || conversation.unreadcount"> | ||||
|                     <span *ngIf="conversation.lastmessagedate > 0" class="addon-message-last-message-date"> | ||||
| @ -180,16 +177,17 @@ | ||||
|                     </span> | ||||
|                 </ion-note> | ||||
|             </div> | ||||
|             <p *ngIf="conversation.subname"><core-format-text [text]="conversation.subname" contextLevel="system" | ||||
|                 [contextInstanceId]="0"></core-format-text></p> | ||||
|             <p *ngIf="conversation.subname"> | ||||
|                 <core-format-text [text]="conversation.subname" contextLevel="system" [contextInstanceId]="0"></core-format-text> | ||||
|             </p> | ||||
|             <p class="addon-message-last-message"> | ||||
|                 <span *ngIf="conversation.sentfromcurrentuser" class="addon-message-last-message-user"> | ||||
|                     {{ 'addon.messages.you' | translate }} | ||||
|                 </span> | ||||
|                 <span *ngIf="!conversation.sentfromcurrentuser && conversation.type == typeGroup && conversation.members[0]" | ||||
|                     class="addon-message-last-message-user">{{ conversation.members[0].fullname + ':' }}</span> | ||||
|                 <core-format-text clean="true" singleLine="true" [text]="conversation.lastmessage" | ||||
|                     class="addon-message-last-message-text" contextLevel="system" [contextInstanceId]="0"></core-format-text> | ||||
|                 <core-format-text clean="true" singleLine="true" [text]="conversation.lastmessage" class="addon-message-last-message-text" | ||||
|                     contextLevel="system" [contextInstanceId]="0"></core-format-text> | ||||
|             </p> | ||||
|         </ion-label> | ||||
|     </ion-item> | ||||
|  | ||||
| @ -3,7 +3,9 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1>{{ 'addon.messages.searchcombined' | translate }}</h1> | ||||
|         <ion-title> | ||||
|             <h1>{{ 'addon.messages.searchcombined' | translate }}</h1> | ||||
|         </ion-title> | ||||
|         <ion-buttons slot="end"> | ||||
|         </ion-buttons> | ||||
|     </ion-toolbar> | ||||
| @ -23,8 +25,7 @@ | ||||
|                     [error]="messages.loadMoreError"></core-infinite-loading> | ||||
|             </ion-list> | ||||
| 
 | ||||
|             <core-empty-box | ||||
|                 *ngIf="displayResults && !contacts.results.length && !nonContacts.results.length && !messages.results.length" | ||||
|             <core-empty-box *ngIf="displayResults && !contacts.results.length && !nonContacts.results.length && !messages.results.length" | ||||
|                 icon="fas-search" [message]="'core.noresults' | translate"> | ||||
|             </core-empty-box> | ||||
|         </core-loading> | ||||
| @ -35,20 +36,20 @@ | ||||
| <ng-template #resultsTemplate let-item="item"> | ||||
|     <ng-container *ngIf="item.results.length > 0"> | ||||
|         <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> | ||||
| 
 | ||||
|         <!-- List of results --> | ||||
|         <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" | ||||
|             button> | ||||
|             (click)="openConversation(result)" [attr.aria-current]="result == selectedResult ? 'page' : 'false'" detail="true" button> | ||||
|             <core-user-avatar slot="start" [user]="result" [checkOnline]="true" [linkProfile]="false"></core-user-avatar> | ||||
|             <ion-label> | ||||
|                 <p class="item-heading"> | ||||
|                     <core-format-text [text]="result.fullname" [highlight]="result.highlightName" [filter]="false"> | ||||
|                     </core-format-text> | ||||
|                     <ion-icon name="fas-ban" *ngIf="result.isblocked" | ||||
|                         [attr.aria-label]="'addon.messages.contactblocked' | translate"> | ||||
|                     <ion-icon name="fas-ban" *ngIf="result.isblocked" [attr.aria-label]="'addon.messages.contactblocked' | translate"> | ||||
|                     </ion-icon> | ||||
|                 </p> | ||||
|                 <ion-note *ngIf="result.lastmessagedate > 0"> | ||||
| @ -58,9 +59,8 @@ | ||||
|                     <span *ngIf="result.sentfromcurrentuser" class="addon-message-last-message-user"> | ||||
|                         {{ 'addon.messages.you' | translate }} | ||||
|                     </span> | ||||
|                     <core-format-text clean="true" singleLine="true" [text]="result.lastmessage" | ||||
|                         [highlight]="result.highlightMessage" contextLevel="system" [contextInstanceId]="0" | ||||
|                         class="addon-message-last-message-text"></core-format-text> | ||||
|                     <core-format-text clean="true" singleLine="true" [text]="result.lastmessage" [highlight]="result.highlightMessage" | ||||
|                         contextLevel="system" [contextInstanceId]="0" class="addon-message-last-message-text"></core-format-text> | ||||
|                 </p> | ||||
|             </ion-label> | ||||
|         </ion-item> | ||||
|  | ||||
| @ -3,7 +3,9 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1>{{ 'addon.messages.messages' | translate }}</h1> | ||||
|         <ion-title> | ||||
|             <h1>{{ 'addon.messages.messages' | translate }}</h1> | ||||
|         </ion-title> | ||||
|     </ion-toolbar> | ||||
| </ion-header> | ||||
| <ion-content> | ||||
| @ -14,15 +16,17 @@ | ||||
|         <!-- Contactable privacy. --> | ||||
|         <ion-card> | ||||
|             <ion-item *ngIf="!advancedContactable"> | ||||
|               <ion-label>{{ 'addon.messages.blocknoncontacts' | translate }}</ion-label> | ||||
|               <ion-toggle [(ngModel)]="contactablePrivacy" (ngModelChange)="saveContactablePrivacy(contactablePrivacy)"> | ||||
|               </ion-toggle> | ||||
|                 <ion-label>{{ 'addon.messages.blocknoncontacts' | translate }}</ion-label> | ||||
|                 <ion-toggle [(ngModel)]="contactablePrivacy" (ngModelChange)="saveContactablePrivacy(contactablePrivacy)"> | ||||
|                 </ion-toggle> | ||||
|             </ion-item> | ||||
| 
 | ||||
|             <ion-list *ngIf="advancedContactable" class="ion-text-wrap"> | ||||
|                 <ion-radio-group [(ngModel)]="contactablePrivacy" (ionChange)="saveContactablePrivacy(contactablePrivacy)"> | ||||
|                     <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> | ||||
|                         <ion-label>{{ 'addon.messages.contactableprivacy_onlycontacts' | translate }}</ion-label> | ||||
| @ -66,16 +70,9 @@ | ||||
|                         <ng-container *ngIf="groupMessagingEnabled"> | ||||
|                             <ion-item class="ion-text-wrap"> | ||||
|                                 <ion-label>{{ processor.displayname }}</ion-label> | ||||
|                                 <core-button-with-spinner | ||||
|                                     *ngIf="!preferences.disableall" | ||||
|                                     [loading]="!!notification.updating" | ||||
|                                     slot="end" | ||||
|                                 > | ||||
|                                     <ion-toggle | ||||
|                                         *ngIf="!processor.locked" | ||||
|                                         [(ngModel)]="processor.checked" | ||||
|                                         (ngModelChange)="changePreference(notification, '', processor)" | ||||
|                                     > | ||||
|                                 <core-button-with-spinner *ngIf="!preferences.disableall" [loading]="!!notification.updating" slot="end"> | ||||
|                                     <ion-toggle *ngIf="!processor.locked" [(ngModel)]="processor.checked" | ||||
|                                         (ngModelChange)="changePreference(notification, '', processor)"> | ||||
|                                     </ion-toggle> | ||||
|                                     <ion-note *ngIf="processor.locked"> | ||||
|                                         {{ processor.lockedmessage }} | ||||
| @ -92,15 +89,11 @@ | ||||
|                             <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 size="2" class="ion-text-center" *ngFor="let state of ['loggedin', 'loggedoff']"> | ||||
|                                     <core-button-with-spinner | ||||
|                                         *ngIf="!preferences.disableall" | ||||
|                                         [loading]="notification.updating && notification.updating[state]" | ||||
|                                     > | ||||
|                                     <core-button-with-spinner *ngIf="!preferences.disableall" | ||||
|                                         [loading]="notification.updating && notification.updating[state]"> | ||||
|                                         <!-- If notifications not disabled, show toggle. --> | ||||
|                                         <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> | ||||
|                                         <div class="ion-padding text-gray" *ngIf="processor.locked"> | ||||
|                                             {{'core.settings.locked' | translate }} | ||||
| @ -118,14 +111,10 @@ | ||||
|                                 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-label>{{ 'core.settings.' + state | translate }}</ion-label> | ||||
|                                 <core-button-with-spinner slot="end" | ||||
|                                     *ngIf="!preferences.disableall" | ||||
|                                     [loading]="notification.updating && notification.updating[state]" | ||||
|                                 > | ||||
|                                     <ion-toggle *ngIf="!processor.locked" | ||||
|                                         [(ngModel)]="processor[state].checked" | ||||
|                                         (ngModelChange)="changePreference(notification, state, processor)" | ||||
|                                     > | ||||
|                                 <core-button-with-spinner slot="end" *ngIf="!preferences.disableall" | ||||
|                                     [loading]="notification.updating && notification.updating[state]"> | ||||
|                                     <ion-toggle *ngIf="!processor.locked" [(ngModel)]="processor[state].checked" | ||||
|                                         (ngModelChange)="changePreference(notification, state, processor)"> | ||||
|                                     </ion-toggle> | ||||
|                                     <ion-note *ngIf="processor.locked"> | ||||
|                                         {{'core.settings.locked' | translate }} | ||||
| @ -144,7 +133,11 @@ | ||||
|         <!-- General settings. --> | ||||
|         <ion-card> | ||||
|             <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-label> | ||||
|                         <p class="item-heading">{{ 'addon.messages.useentertosend' | translate }}</p> | ||||
|  | ||||
| @ -1,6 +1,8 @@ | ||||
| <ion-header> | ||||
|     <ion-toolbar> | ||||
|         <h2>{{ plugin.name }}</h2> | ||||
|         <ion-title> | ||||
|             <h2>{{ plugin.name }}</h2> | ||||
|         </ion-title> | ||||
|         <ion-buttons slot="end"> | ||||
|             <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> | ||||
| @ -10,8 +12,7 @@ | ||||
| </ion-header> | ||||
| <ion-content> | ||||
|     <form name="addon-mod_assign-edit-feedback-form" *ngIf="userId && plugin" #editFeedbackForm> | ||||
|         <addon-mod-assign-feedback-plugin [assign]="assign" [submission]="submission" [userId]="userId" | ||||
|             [plugin]="plugin" [edit]="true"> | ||||
|         <addon-mod-assign-feedback-plugin [assign]="assign" [submission]="submission" [userId]="userId" [plugin]="plugin" [edit]="true"> | ||||
|         </addon-mod-assign-feedback-plugin> | ||||
|         <ion-button expand="block" (click)="done($event)">{{ 'core.done' | translate }}</ion-button> | ||||
|     </form> | ||||
|  | ||||
| @ -3,10 +3,12 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1> | ||||
|             <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="moduleId" [courseId]="courseId"> | ||||
|             </core-format-text> | ||||
|         </h1> | ||||
|         <ion-title> | ||||
|             <h1> | ||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="moduleId" [courseId]="courseId"> | ||||
|                 </core-format-text> | ||||
|             </h1> | ||||
|         </ion-title> | ||||
|         <ion-buttons slot="end"> | ||||
|             <ion-button fill="clear" (click)="save()"> | ||||
|                 {{ 'core.save' | translate }} | ||||
|  | ||||
| @ -3,10 +3,12 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1> | ||||
|             <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> | ||||
|             </core-format-text> | ||||
|         </h1> | ||||
|         <ion-title> | ||||
|             <h1> | ||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> | ||||
|                 </core-format-text> | ||||
|             </h1> | ||||
|         </ion-title> | ||||
| 
 | ||||
|         <ion-buttons slot="end"> | ||||
|             <!-- The buttons defined by the component will be added in here. --> | ||||
|  | ||||
| @ -3,10 +3,12 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1> | ||||
|             <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="moduleId" [courseId]="courseId"> | ||||
|             </core-format-text> | ||||
|         </h1> | ||||
|         <ion-title> | ||||
|             <h1> | ||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="moduleId" [courseId]="courseId"> | ||||
|                 </core-format-text> | ||||
|             </h1> | ||||
|         </ion-title> | ||||
| 
 | ||||
|         <ion-buttons slot="end"></ion-buttons> | ||||
|     </ion-toolbar> | ||||
|  | ||||
| @ -3,10 +3,12 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1> | ||||
|             <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="moduleId" [courseId]="courseId"> | ||||
|             </core-format-text> | ||||
|         </h1> | ||||
|         <ion-title> | ||||
|             <h1> | ||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="moduleId" [courseId]="courseId"> | ||||
|                 </core-format-text> | ||||
|             </h1> | ||||
|         </ion-title> | ||||
| 
 | ||||
|         <ion-buttons slot="end"></ion-buttons> | ||||
|     </ion-toolbar> | ||||
|  | ||||
| @ -1,6 +1,8 @@ | ||||
| <ion-header> | ||||
|     <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-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate"> | ||||
|                 <ion-icon name="fas-times" slot="icon-only" aria-hidden=true></ion-icon> | ||||
| @ -12,14 +14,12 @@ | ||||
|     <nav> | ||||
|         <ion-list> | ||||
|             <ion-item class="ion-text-wrap" *ngFor="let chapter of chapters" (click)="loadChapter(chapter.id)" | ||||
|                 [attr.aria-current]="selected == chapter.id ? 'page' : 'false'" button | ||||
|                 [class.item-dimmed]="chapter.hidden" detail="false"> | ||||
|                 [attr.aria-current]="selected == chapter.id ? 'page' : 'false'" button [class.item-dimmed]="chapter.hidden" detail="false"> | ||||
|                 <ion-label> | ||||
|                     <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="showBullets" class="addon-mod-book-bullet">• </span> | ||||
|                         <core-format-text [text]="chapter.title" contextLevel="module" [contextInstanceId]="moduleId" | ||||
|                             [courseId]="courseId"> | ||||
|                         <core-format-text [text]="chapter.title" contextLevel="module" [contextInstanceId]="moduleId" [courseId]="courseId"> | ||||
|                         </core-format-text> | ||||
|                     </p> | ||||
|                 </ion-label> | ||||
|  | ||||
| @ -3,10 +3,12 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1> | ||||
|             <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> | ||||
|             </core-format-text> | ||||
|         </h1> | ||||
|         <ion-title> | ||||
|             <h1> | ||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> | ||||
|                 </core-format-text> | ||||
|             </h1> | ||||
|         </ion-title> | ||||
|         <ion-buttons slot="end"> | ||||
|             <!-- The buttons defined by the component will be added in here. --> | ||||
|         </ion-buttons> | ||||
|  | ||||
| @ -1,9 +1,8 @@ | ||||
| <ion-header> | ||||
|     <ion-toolbar> | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h2>{{ 'addon.mod_chat.currentusers' | translate }}</h2> | ||||
|         <ion-title> | ||||
|             <h2>{{ 'addon.mod_chat.currentusers' | translate }}</h2> | ||||
|         </ion-title> | ||||
|         <ion-buttons slot="end"> | ||||
|             <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> | ||||
| @ -13,8 +12,7 @@ | ||||
| </ion-header> | ||||
| <ion-content> | ||||
|     <core-loading [hideUntil]="usersLoaded"> | ||||
|         <ion-item class="ion-text-wrap" *ngFor="let user of users" | ||||
|             [class.addon-mod-chat-user]="currentUserId != user.id && isOnline"> | ||||
|         <ion-item class="ion-text-wrap" *ngFor="let user of users" [class.addon-mod-chat-user]="currentUserId != user.id && isOnline"> | ||||
| 
 | ||||
|             <core-user-avatar [user]="user" slot="start" [linkProfile]="false"></core-user-avatar> | ||||
|             <ion-label> | ||||
|  | ||||
| @ -3,10 +3,12 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1> | ||||
|             <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId"> | ||||
|             </core-format-text> | ||||
|         </h1> | ||||
|         <ion-title> | ||||
|             <h1> | ||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId"> | ||||
|                 </core-format-text> | ||||
|             </h1> | ||||
|         </ion-title> | ||||
|         <ion-buttons slot="end"> | ||||
|             <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> | ||||
| @ -72,7 +74,7 @@ | ||||
|                             {{ message.timestamp * 1000 | coreFormatDate:"strftimetime" }} | ||||
|                             <strong> | ||||
|                                 {{ message.userfullname }} <core-format-text [text]="message.message" contextLevel="module" | ||||
|                                 [contextInstanceId]="cmId" [courseId]="courseId" (afterRender)="last && scrollToBottom()"> | ||||
|                                     [contextInstanceId]="cmId" [courseId]="courseId" (afterRender)="last && scrollToBottom()"> | ||||
|                                 </core-format-text> | ||||
|                             </strong> | ||||
|                         </span> | ||||
| @ -81,8 +83,7 @@ | ||||
| 
 | ||||
|                 <ion-item *ngIf="!message.special" class="ion-text-wrap addon-message" | ||||
|                     [class.addon-message-mine]="message.userid == currentUserId" | ||||
|                     [class.addon-message-not-mine]="message.userid != currentUserId" | ||||
|                     [class.addon-message-no-user]="!message.showUserData" | ||||
|                     [class.addon-message-not-mine]="message.userid != currentUserId" [class.addon-message-no-user]="!message.showUserData" | ||||
|                     [@coreSlideInOut]="message.userid == currentUserId ? '' : 'fromLeft'"> | ||||
|                     <ion-label> | ||||
|                         <!-- User data. --> | ||||
| @ -104,8 +105,7 @@ | ||||
|             </ng-container> | ||||
|         </ion-list> | ||||
| 
 | ||||
|         <core-empty-box *ngIf="!messages || messages.length <= 0" icon="far-comments" | ||||
|             [message]="'addon.mod_chat.nomessages' | translate"> | ||||
|         <core-empty-box *ngIf="!messages || messages.length <= 0" icon="far-comments" [message]="'addon.mod_chat.nomessages' | translate"> | ||||
|         </core-empty-box> | ||||
|     </core-loading> | ||||
| </ion-content> | ||||
|  | ||||
| @ -3,10 +3,12 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1> | ||||
|             <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> | ||||
|             </core-format-text> | ||||
|         </h1> | ||||
|         <ion-title> | ||||
|             <h1> | ||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> | ||||
|                 </core-format-text> | ||||
|             </h1> | ||||
|         </ion-title> | ||||
|         <ion-buttons slot="end"> | ||||
|             <!-- The buttons defined by the component will be added in here. --> | ||||
|         </ion-buttons> | ||||
|  | ||||
| @ -3,7 +3,9 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1>{{ 'addon.mod_chat.messages' | translate }}</h1> | ||||
|         <ion-title> | ||||
|             <h1>{{ 'addon.mod_chat.messages' | translate }}</h1> | ||||
|         </ion-title> | ||||
|     </ion-toolbar> | ||||
| </ion-header> | ||||
| <ion-content> | ||||
| @ -67,7 +69,7 @@ | ||||
|                             {{ message.timestamp * 1000 | coreFormatDate:"strftimetime" }} | ||||
|                             <strong> | ||||
|                                 {{ message.userfullname }} <core-format-text [text]="message.message" contextLevel="module" | ||||
|                                 [contextInstanceId]="cmId" [courseId]="courseId"></core-format-text> | ||||
|                                     [contextInstanceId]="cmId" [courseId]="courseId"></core-format-text> | ||||
|                             </strong> | ||||
|                         </span> | ||||
|                     </ion-badge> | ||||
| @ -75,8 +77,7 @@ | ||||
| 
 | ||||
|                 <ion-item *ngIf="!message.special" class="ion-text-wrap addon-message" | ||||
|                     [class.addon-message-mine]="message.userid == currentUserId" | ||||
|                     [class.addon-message-not-mine]="message.userid != currentUserId" | ||||
|                     [class.addon-message-no-user]="!message.showUserData"> | ||||
|                     [class.addon-message-not-mine]="message.userid != currentUserId" [class.addon-message-no-user]="!message.showUserData"> | ||||
|                     <ion-label> | ||||
|                         <!-- User data. --> | ||||
|                         <h2 class="addon-message-user"> | ||||
|  | ||||
| @ -3,7 +3,9 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1>{{ 'addon.mod_chat.chatreport' | translate }}</h1> | ||||
|         <ion-title> | ||||
|             <h1>{{ 'addon.mod_chat.chatreport' | translate }}</h1> | ||||
|         </ion-title> | ||||
|     </ion-toolbar> | ||||
| </ion-header> | ||||
| <ion-content> | ||||
|  | ||||
| @ -3,10 +3,12 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1> | ||||
|             <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> | ||||
|             </core-format-text> | ||||
|         </h1> | ||||
|         <ion-title> | ||||
|             <h1> | ||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> | ||||
|                 </core-format-text> | ||||
|             </h1> | ||||
|         </ion-title> | ||||
|         <ion-buttons slot="end"> | ||||
|             <!-- The buttons defined by the component will be added in here. --> | ||||
|         </ion-buttons> | ||||
|  | ||||
| @ -1,9 +1,8 @@ | ||||
| <ion-header> | ||||
|     <ion-toolbar> | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h2>{{ 'addon.mod_data.search' | translate }}</h2> | ||||
|         <ion-title> | ||||
|             <h2>{{ 'addon.mod_data.search' | translate }}</h2> | ||||
|         </ion-title> | ||||
|         <ion-buttons slot="end"> | ||||
|             <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> | ||||
| @ -20,14 +19,14 @@ | ||||
|         <ion-list class="ion-no-margin"> | ||||
|             <ion-item [hidden]="search.searchingAdvanced"> | ||||
|                 <ion-label class="sr-only">{{ 'addon.mod_data.search' | translate}}</ion-label> | ||||
|                 <ion-input type="text" placeholder="{{ 'addon.mod_data.search' | translate}}" | ||||
|                     [(ngModel)]="search.text" name="text" formControlName="text"> | ||||
|                 <ion-input type="text" placeholder="{{ 'addon.mod_data.search' | translate}}" [(ngModel)]="search.text" name="text" | ||||
|                     formControlName="text"> | ||||
|                 </ion-input> | ||||
|             </ion-item> | ||||
|             <ion-item class="ion-text-wrap"> | ||||
|                 <ion-label position="stacked">{{ 'core.sortby' | translate }}</ion-label> | ||||
|                 <ion-select interface="action-sheet" name="sortBy" formControlName="sortBy" | ||||
|                     [placeholder]="'core.sortby' | translate" [interfaceOptions]="{header: 'core.sortby' | translate}"> | ||||
|                 <ion-select interface="action-sheet" name="sortBy" formControlName="sortBy" [placeholder]="'core.sortby' | translate" | ||||
|                     [interfaceOptions]="{header: 'core.sortby' | 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> | ||||
|                     </optgroup> | ||||
| @ -42,7 +41,7 @@ | ||||
|                     </optgroup> | ||||
|                 </ion-select> | ||||
|             </ion-item> | ||||
|             <ion-list > | ||||
|             <ion-list> | ||||
|                 <ion-radio-group [(ngModel)]="search.sortDirection" name="sortDirection" formControlName="sortDirection"> | ||||
|                     <ion-item> | ||||
|                         <ion-label>{{ 'addon.mod_data.ascending' | translate }}</ion-label> | ||||
|  | ||||
| @ -3,10 +3,12 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1> | ||||
|             <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId"> | ||||
|             </core-format-text> | ||||
|         </h1> | ||||
|         <ion-title> | ||||
|             <h1> | ||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId"> | ||||
|                 </core-format-text> | ||||
|             </h1> | ||||
|         </ion-title> | ||||
|         <ion-buttons slot="end"> | ||||
|             <ion-button *ngIf="entry" fill="clear" (click)="save($event)"> | ||||
|                 {{ 'core.save' | translate }} | ||||
|  | ||||
| @ -3,15 +3,16 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1> | ||||
|             <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId"> | ||||
|             </core-format-text> | ||||
|         </h1> | ||||
|         <ion-title> | ||||
|             <h1> | ||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId"> | ||||
|                 </core-format-text> | ||||
|             </h1> | ||||
|         </ion-title> | ||||
|     </ion-toolbar> | ||||
| </ion-header> | ||||
| <ion-content> | ||||
|     <ion-refresher slot="fixed" | ||||
|         [disabled]="!entryLoaded || !(isPullingToRefresh || !renderingEntry && !loadingRating && !loadingComments)" | ||||
|     <ion-refresher slot="fixed" [disabled]="!entryLoaded || !(isPullingToRefresh || !renderingEntry && !loadingRating && !loadingComments)" | ||||
|         (ionRefresh)="refreshDatabase($event.target)"> | ||||
|         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> | ||||
|     </ion-refresher> | ||||
| @ -40,23 +41,23 @@ | ||||
|         <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-compile-html [text]="entryHtml" [jsData]="jsData" [extraImports]="extraImports" | ||||
|                 (compiling)="setRenderingEntry($event)"></core-compile-html> | ||||
|             <core-compile-html [text]="entryHtml" [jsData]="jsData" [extraImports]="extraImports" (compiling)="setRenderingEntry($event)"> | ||||
|             </core-compile-html> | ||||
|         </div> | ||||
| 
 | ||||
|         <core-rating-rate *ngIf="database && entry && ratingInfo && (!database.approval || entry.approved)" | ||||
|             [ratingInfo]="ratingInfo" contextLevel="module" [instanceId]="database.coursemodule" [itemId]="entry.id" [itemSetId]="0" | ||||
|             [courseId]="courseId" [aggregateMethod]="database.assessed" [scaleId]="database.scale" [userId]="entry.userid" | ||||
|             (onLoading)="setLoadingRating($event)" (onUpdate)="ratingUpdated()"> | ||||
|         <core-rating-rate *ngIf="database && entry && ratingInfo && (!database.approval || entry.approved)" [ratingInfo]="ratingInfo" | ||||
|             contextLevel="module" [instanceId]="database.coursemodule" [itemId]="entry.id" [itemSetId]="0" [courseId]="courseId" | ||||
|             [aggregateMethod]="database.assessed" [scaleId]="database.scale" [userId]="entry.userid" (onLoading)="setLoadingRating($event)" | ||||
|             (onUpdate)="ratingUpdated()"> | ||||
|         </core-rating-rate> | ||||
|         <core-rating-aggregate *ngIf="database && entry && ratingInfo" [ratingInfo]="ratingInfo" contextLevel="module" | ||||
|             [instanceId]="database.coursemodule" [itemId]="entry.id" [courseId]="courseId" [aggregateMethod]="database.assessed" | ||||
|             [scaleId]="database.scale"> | ||||
|         </core-rating-aggregate> | ||||
| 
 | ||||
|         <core-comments *ngIf="database && database.comments && entry && entry.id > 0 && commentsEnabled" | ||||
|             contextLevel="module" [instanceId]="database.coursemodule" component="mod_data" [itemId]="entry.id" | ||||
|             area="database_entry" [courseId]="courseId" (onLoading)="setLoadingComments($event)" [showItem]="true"> | ||||
|         <core-comments *ngIf="database && database.comments && entry && entry.id > 0 && commentsEnabled" contextLevel="module" | ||||
|             [instanceId]="database.coursemodule" component="mod_data" [itemId]="entry.id" area="database_entry" [courseId]="courseId" | ||||
|             (onLoading)="setLoadingComments($event)" [showItem]="true"> | ||||
|         </core-comments> | ||||
| 
 | ||||
|         <ion-grid *ngIf="hasPrevious || hasNext"> | ||||
|  | ||||
| @ -3,10 +3,12 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1> | ||||
|             <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId"> | ||||
|             </core-format-text> | ||||
|         </h1> | ||||
|         <ion-title> | ||||
|             <h1> | ||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId"> | ||||
|                 </core-format-text> | ||||
|             </h1> | ||||
|         </ion-title> | ||||
| 
 | ||||
|         <ion-buttons slot="end"> | ||||
|             <!-- The buttons defined by the component will be added in here. --> | ||||
|  | ||||
| @ -3,12 +3,12 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1> | ||||
|             <ng-container *ngIf="attempt">{{ attempt.fullname }}</ng-container> | ||||
|             <ng-container *ngIf="anonAttempt"> | ||||
|         <ion-title> | ||||
|             <h1 *ngIf="attempt">{{ attempt.fullname }}</h1> | ||||
|             <h1 *ngIf="anonAttempt"> | ||||
|                 {{ 'addon.mod_feedback.response_nr' |translate }}: {{anonAttempt.number}} | ||||
|             </ng-container> | ||||
|         </h1> | ||||
|             </h1> | ||||
|         </ion-title> | ||||
|     </ion-toolbar> | ||||
| </ion-header> | ||||
| <ion-content> | ||||
| @ -30,7 +30,7 @@ | ||||
|                         ({{ 'addon.mod_feedback.anonymous' |translate }}) | ||||
|                     </h2> | ||||
|                 </ion-label> | ||||
|             </ion-item > | ||||
|             </ion-item> | ||||
|             <ng-container *ngIf="items && items.length"> | ||||
|                 <ng-container *ngFor="let item of items"> | ||||
|                     <core-spacer *ngIf="item.typ == 'pagebreak'"></core-spacer> | ||||
| @ -38,8 +38,8 @@ | ||||
|                         <ion-label> | ||||
|                             <h2 *ngIf="item.name" [core-mark-required]="item.required"> | ||||
|                                 <span *ngIf="feedback!.autonumbering && item.itemnumber">{{item.itemnumber}}. </span> | ||||
|                                 <core-format-text [component]="component" [componentId]="cmId" [text]="item.name" | ||||
|                                     contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId"> | ||||
|                                 <core-format-text [component]="component" [componentId]="cmId" [text]="item.name" contextLevel="module" | ||||
|                                     [contextInstanceId]="cmId" [courseId]="courseId"> | ||||
|                                 </core-format-text> | ||||
|                             </h2> | ||||
|                             <p *ngIf="item.submittedValue"> | ||||
|  | ||||
| @ -3,10 +3,12 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1> | ||||
|             <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId"> | ||||
|             </core-format-text> | ||||
|         </h1> | ||||
|         <ion-title> | ||||
|             <h1> | ||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId"> | ||||
|                 </core-format-text> | ||||
|             </h1> | ||||
|         </ion-title> | ||||
|     </ion-toolbar> | ||||
| </ion-header> | ||||
| <ion-content> | ||||
| @ -28,22 +30,20 @@ | ||||
|                             <ion-label [position]="item.hasTextInput ? 'stacked' : undefined"> | ||||
|                                 <p *ngIf="item.name" [core-mark-required]="item.required"> | ||||
|                                     <span *ngIf="feedback!.autonumbering && item.itemnumber">{{item.itemnumber}}. </span> | ||||
|                                     <core-format-text [component]="component" [componentId]="cmId" [text]="item.name" | ||||
|                                         contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId" [wsNotFiltered]="true"> | ||||
|                                     <core-format-text [component]="component" [componentId]="cmId" [text]="item.name" contextLevel="module" | ||||
|                                         [contextInstanceId]="cmId" [courseId]="courseId" [wsNotFiltered]="true"> | ||||
|                                     </core-format-text> | ||||
|                                     <span *ngIf="item.postfix" class="addon-mod_feedback-postfix">{{item.postfix}}</span> | ||||
|                                 </p> | ||||
|                                 <p *ngIf="item.templateName == 'label'"> | ||||
|                                     <core-format-text [component]="component" [componentId]="cmId" | ||||
|                                         [text]="item.presentation" contextLevel="module" [contextInstanceId]="cmId" | ||||
|                                         [wsNotFiltered]="true" [courseId]="courseId"> | ||||
|                                     <core-format-text [component]="component" [componentId]="cmId" [text]="item.presentation" | ||||
|                                         contextLevel="module" [contextInstanceId]="cmId" [wsNotFiltered]="true" [courseId]="courseId"> | ||||
|                                     </core-format-text> | ||||
|                                 </p> | ||||
|                             </ion-label> | ||||
| 
 | ||||
|                             <ion-input *ngIf="item.templateName == 'textfield'" type="text" [(ngModel)]="item.value" | ||||
|                                 autocorrect="off" name="{{item.typ}}_{{item.id}}" maxlength="{{item.length}}" | ||||
|                                 [required]="item.required"> | ||||
|                             <ion-input *ngIf="item.templateName == 'textfield'" type="text" [(ngModel)]="item.value" autocorrect="off" | ||||
|                                 name="{{item.typ}}_{{item.id}}" maxlength="{{item.length}}" [required]="item.required"> | ||||
|                             </ion-input> | ||||
| 
 | ||||
|                             <ng-container *ngIf="item.templateName == 'numeric'"> | ||||
| @ -56,8 +56,8 @@ | ||||
|                                 </ion-text> | ||||
|                             </ng-container> | ||||
| 
 | ||||
|                             <ion-textarea *ngIf="item.templateName == 'textarea'" [required]="item.required" | ||||
|                                 name="{{item.typ}}_{{item.id}}" [(ngModel)]="item.value"> | ||||
|                             <ion-textarea *ngIf="item.templateName == 'textarea'" [required]="item.required" name="{{item.typ}}_{{item.id}}" | ||||
|                                 [(ngModel)]="item.value"> | ||||
|                             </ion-textarea> | ||||
| 
 | ||||
|                             <ion-select *ngIf="item.templateName == 'multichoice-d'" [required]="item.required" | ||||
| @ -65,20 +65,18 @@ | ||||
|                                 [interfaceOptions]="{header: item.name}"> | ||||
|                                 <ion-select-option *ngFor="let option of item.choices" [value]="option.value"> | ||||
|                                     <core-format-text [component]="component" [componentId]="cmId" [text]="option.label" | ||||
|                                         contextLevel="module" [contextInstanceId]="cmId" [wsNotFiltered]="true" | ||||
|                                         [courseId]="courseId"> | ||||
|                                         contextLevel="module" [contextInstanceId]="cmId" [wsNotFiltered]="true" [courseId]="courseId"> | ||||
|                                     </core-format-text> | ||||
|                                 </ion-select-option> | ||||
|                             </ion-select> | ||||
|                         </ion-item> | ||||
| 
 | ||||
|                         <ion-radio-group *ngIf="item.templateName == 'multichoice-r'" [(ngModel)]="item.value" | ||||
|                             [required]="item.required" name="{{item.typ}}_{{item.id}}"> | ||||
|                         <ion-radio-group *ngIf="item.templateName == 'multichoice-r'" [(ngModel)]="item.value" [required]="item.required" | ||||
|                             name="{{item.typ}}_{{item.id}}"> | ||||
|                             <ion-item *ngFor="let option of item.choices"> | ||||
|                                 <ion-label> | ||||
|                                     <core-format-text [component]="component" [componentId]="cmId" | ||||
|                                         [text]="option.label" contextLevel="module" [contextInstanceId]="cmId" | ||||
|                                         [wsNotFiltered]="true" [courseId]="courseId"> | ||||
|                                     <core-format-text [component]="component" [componentId]="cmId" [text]="option.label" | ||||
|                                         contextLevel="module" [contextInstanceId]="cmId" [wsNotFiltered]="true" [courseId]="courseId"> | ||||
|                                     </core-format-text> | ||||
|                                 </ion-label> | ||||
|                                 <ion-radio slot="start" [value]="option.value"></ion-radio> | ||||
| @ -89,19 +87,18 @@ | ||||
|                             <ion-item *ngFor="let option of item.choices"> | ||||
|                                 <ion-label> | ||||
|                                     <core-format-text [component]="component" [componentId]="cmId" [text]="option.label" | ||||
|                                         contextLevel="module" [contextInstanceId]="cmId" [wsNotFiltered]="true" | ||||
|                                         [courseId]="courseId"> | ||||
|                                         contextLevel="module" [contextInstanceId]="cmId" [wsNotFiltered]="true" [courseId]="courseId"> | ||||
|                                     </core-format-text> | ||||
|                                 </ion-label> | ||||
|                                 <ion-checkbox [required]="item.required" name="{{item.typ}}_{{item.id}}" | ||||
|                                     [(ngModel)]="option.checked" value="option.value"> | ||||
|                                 <ion-checkbox [required]="item.required" name="{{item.typ}}_{{item.id}}" [(ngModel)]="option.checked" | ||||
|                                     value="option.value"> | ||||
|                                 </ion-checkbox> | ||||
|                             </ion-item> | ||||
|                         </ng-container> | ||||
| 
 | ||||
|                         <ng-container *ngIf="item.templateName == 'captcha'"> | ||||
|                             <core-recaptcha *ngIf="!preview && !offline" [publicKey]="item.captcha.recaptchapublickey" | ||||
|                                 [model]="item" modelValueName="value"> | ||||
|                             <core-recaptcha *ngIf="!preview && !offline" [publicKey]="item.captcha.recaptchapublickey" [model]="item" | ||||
|                                 modelValueName="value"> | ||||
|                             </core-recaptcha> | ||||
|                             <div *ngIf="!preview && (!item.captcha || offline)" class="core-warning-card"> | ||||
|                                 <ion-item> | ||||
|  | ||||
| @ -3,10 +3,12 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1> | ||||
|             <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> | ||||
|             </core-format-text> | ||||
|         </h1> | ||||
|         <ion-title> | ||||
|             <h1> | ||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> | ||||
|                 </core-format-text> | ||||
|             </h1> | ||||
|         </ion-title> | ||||
|         <ion-buttons slot="end"> | ||||
|             <!-- The buttons defined by the component will be added in here. --> | ||||
|         </ion-buttons> | ||||
|  | ||||
| @ -3,7 +3,9 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1>{{ 'addon.mod_feedback.responses' |translate }}</h1> | ||||
|         <ion-title> | ||||
|             <h1>{{ 'addon.mod_feedback.responses' |translate }}</h1> | ||||
|         </ion-title> | ||||
|     </ion-toolbar> | ||||
| </ion-header> | ||||
| <ion-content> | ||||
| @ -27,7 +29,9 @@ | ||||
|             </ion-item> | ||||
| 
 | ||||
|             <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> | ||||
|             <ng-container *ngIf="total > 0"> | ||||
|                 <ion-item *ngFor="let user of users" class="ion-text-wrap"> | ||||
|  | ||||
| @ -3,7 +3,9 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1>{{ 'addon.mod_feedback.responses' |translate }}</h1> | ||||
|         <ion-title> | ||||
|             <h1>{{ 'addon.mod_feedback.responses' |translate }}</h1> | ||||
|         </ion-title> | ||||
|     </ion-toolbar> | ||||
| </ion-header> | ||||
| <ion-content> | ||||
| @ -48,7 +50,9 @@ | ||||
|                         {{ 'core.loadmore' | translate }} | ||||
|                     </ion-button> | ||||
|                     <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> | ||||
|                 </ng-container> | ||||
| 
 | ||||
| @ -71,7 +75,9 @@ | ||||
|                         {{ 'core.loadmore' | translate }} | ||||
|                     </ion-button> | ||||
|                     <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> | ||||
|                 </ng-container> | ||||
|             </ion-list> | ||||
|  | ||||
| @ -3,10 +3,12 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1> | ||||
|             <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> | ||||
|             </core-format-text> | ||||
|         </h1> | ||||
|         <ion-title> | ||||
|             <h1> | ||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> | ||||
|                 </core-format-text> | ||||
|             </h1> | ||||
|         </ion-title> | ||||
| 
 | ||||
|         <ion-buttons slot="end"> | ||||
|             <!-- The buttons defined by the component will be added in here. --> | ||||
|  | ||||
| @ -1,6 +1,8 @@ | ||||
| <ion-header> | ||||
|     <ion-toolbar> | ||||
|         <h2 id="addon-mod-forum-sort-order-label">{{ 'core.sort' | translate }}</h2> | ||||
|         <ion-title> | ||||
|             <h2 id="addon-mod-forum-sort-order-label">{{ 'core.sort' | translate }}</h2> | ||||
|         </ion-title> | ||||
|         <ion-buttons slot="end"> | ||||
|             <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> | ||||
|  | ||||
| @ -3,10 +3,12 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1 *ngIf="startingPost"> | ||||
|             <core-format-text contextLevel="module" [text]="startingPost.subject" [contextInstanceId]="cmId" [courseId]="courseId"> | ||||
|             </core-format-text> | ||||
|         </h1> | ||||
|         <ion-title> | ||||
|             <h1 *ngIf="startingPost"> | ||||
|                 <core-format-text contextLevel="module" [text]="startingPost.subject" [contextInstanceId]="cmId" [courseId]="courseId"> | ||||
|                 </core-format-text> | ||||
|             </h1> | ||||
|         </ion-title> | ||||
|         <ion-buttons slot="end"> | ||||
|             <!-- The context menu will be added in here. --> | ||||
|         </ion-buttons> | ||||
| @ -14,48 +16,41 @@ | ||||
| </ion-header> | ||||
| <core-navbar-buttons slot="end"> | ||||
|     <core-context-menu> | ||||
|         <core-context-menu-item *ngIf="discussionLoaded && !postHasOffline && isOnline" | ||||
|             [priority]="650" [content]="'addon.mod_forum.refreshposts' | translate" [iconAction]="refreshIcon" [closeOnClick]="false" | ||||
|         <core-context-menu-item *ngIf="discussionLoaded && !postHasOffline && isOnline" [priority]="650" | ||||
|             [content]="'addon.mod_forum.refreshposts' | translate" [iconAction]="refreshIcon" [closeOnClick]="false" | ||||
|             (action)="doRefresh(null, $event)"> | ||||
|         </core-context-menu-item> | ||||
|         <core-context-menu-item *ngIf="discussionLoaded && isMobile && postHasOffline && isOnline" | ||||
|             [priority]="550" [content]="'core.settings.synchronizenow' | translate" [iconAction]="syncIcon" [closeOnClick]="false" | ||||
|         <core-context-menu-item *ngIf="discussionLoaded && isMobile && postHasOffline && isOnline" [priority]="550" | ||||
|             [content]="'core.settings.synchronizenow' | translate" [iconAction]="syncIcon" [closeOnClick]="false" | ||||
|             (action)="doRefresh(null, $event, true)"> | ||||
|         </core-context-menu-item> | ||||
|         <core-context-menu-item [hidden]="sort == 'flat-oldest'" | ||||
|             [priority]="500" [content]="'addon.mod_forum.modeflatoldestfirst' | translate" iconAction="fas-arrow-down" | ||||
|             (action)="changeSort('flat-oldest')"> | ||||
|         <core-context-menu-item [hidden]="sort == 'flat-oldest'" [priority]="500" | ||||
|             [content]="'addon.mod_forum.modeflatoldestfirst' | translate" iconAction="fas-arrow-down" (action)="changeSort('flat-oldest')"> | ||||
|         </core-context-menu-item> | ||||
|         <core-context-menu-item [hidden]="sort == 'flat-newest'" | ||||
|             [priority]="450" [content]="'addon.mod_forum.modeflatnewestfirst' | translate" iconAction="fas-arrow-up" | ||||
|             (action)="changeSort('flat-newest')"> | ||||
|         <core-context-menu-item [hidden]="sort == 'flat-newest'" [priority]="450" | ||||
|             [content]="'addon.mod_forum.modeflatnewestfirst' | translate" iconAction="fas-arrow-up" (action)="changeSort('flat-newest')"> | ||||
|         </core-context-menu-item> | ||||
|         <core-context-menu-item [hidden]="sort == 'nested'" | ||||
|             [priority]="400" [content]="'addon.mod_forum.modenested' | translate" iconAction="fas-exchange-alt" | ||||
|             (action)="changeSort('nested')"> | ||||
|         <core-context-menu-item [hidden]="sort == 'nested'" [priority]="400" [content]="'addon.mod_forum.modenested' | translate" | ||||
|             iconAction="fas-exchange-alt" (action)="changeSort('nested')"> | ||||
|         </core-context-menu-item> | ||||
|         <core-context-menu-item [hidden]="!discussion || !discussion.canlock || discussion.locked" | ||||
|             [priority]="300" [content]="'addon.mod_forum.lockdiscussion' | translate" iconAction="fas-lock" | ||||
|             (action)="setLockState(true)"> | ||||
|         <core-context-menu-item [hidden]="!discussion || !discussion.canlock || discussion.locked" [priority]="300" | ||||
|             [content]="'addon.mod_forum.lockdiscussion' | translate" iconAction="fas-lock" (action)="setLockState(true)"> | ||||
|         </core-context-menu-item> | ||||
|         <core-context-menu-item [hidden]="!discussion || !discussion.canlock || !discussion.locked" | ||||
|             [priority]="300" [content]="'addon.mod_forum.unlockdiscussion' | translate" iconAction="fas-unlock" | ||||
|             (action)="setLockState(false)"> | ||||
|         <core-context-menu-item [hidden]="!discussion || !discussion.canlock || !discussion.locked" [priority]="300" | ||||
|             [content]="'addon.mod_forum.unlockdiscussion' | translate" iconAction="fas-unlock" (action)="setLockState(false)"> | ||||
|         </core-context-menu-item> | ||||
|         <core-context-menu-item [hidden]="!discussion || !canPin || discussion.pinned" | ||||
|             [priority]="250" [content]="'addon.mod_forum.pindiscussion' | translate" iconAction="fas-map-pin" | ||||
|             (action)="setPinState(true)"> | ||||
|         <core-context-menu-item [hidden]="!discussion || !canPin || discussion.pinned" [priority]="250" | ||||
|             [content]="'addon.mod_forum.pindiscussion' | translate" iconAction="fas-map-pin" (action)="setPinState(true)"> | ||||
|         </core-context-menu-item> | ||||
|         <core-context-menu-item [hidden]="!discussion || !canPin || !discussion.pinned" | ||||
|             [priority]="250" [content]="'addon.mod_forum.unpindiscussion' | translate" [iconSlash]="true" iconAction="fas-map-pin" | ||||
|         <core-context-menu-item [hidden]="!discussion || !canPin || !discussion.pinned" [priority]="250" | ||||
|             [content]="'addon.mod_forum.unpindiscussion' | translate" [iconSlash]="true" iconAction="fas-map-pin" | ||||
|             (action)="setPinState(false)"> | ||||
|         </core-context-menu-item> | ||||
|         <core-context-menu-item [hidden]="!discussion || !discussion.canfavourite || discussion.starred" | ||||
|             [priority]="200" [content]="'addon.mod_forum.addtofavourites' | translate" iconAction="fas-star" | ||||
|             (action)="toggleFavouriteState(true)"> | ||||
|         <core-context-menu-item [hidden]="!discussion || !discussion.canfavourite || discussion.starred" [priority]="200" | ||||
|             [content]="'addon.mod_forum.addtofavourites' | translate" iconAction="fas-star" (action)="toggleFavouriteState(true)"> | ||||
|         </core-context-menu-item> | ||||
|         <core-context-menu-item [hidden]="!discussion || !discussion.canfavourite || !discussion.starred" | ||||
|             [priority]="200" [content]="'addon.mod_forum.removefromfavourites' | translate" iconAction="fas-star" [iconSlash]="true" | ||||
|         <core-context-menu-item [hidden]="!discussion || !discussion.canfavourite || !discussion.starred" [priority]="200" | ||||
|             [content]="'addon.mod_forum.removefromfavourites' | translate" iconAction="fas-star" [iconSlash]="true" | ||||
|             (action)="toggleFavouriteState(false)"> | ||||
|         </core-context-menu-item> | ||||
|     </core-context-menu> | ||||
| @ -90,25 +85,20 @@ | ||||
|         </ion-card> | ||||
| 
 | ||||
|         <div *ngIf="startingPost" class="ion-margin-bottom"> | ||||
|             <addon-mod-forum-post | ||||
|                 [post]="startingPost" [discussion]="discussion" [courseId]="courseId" [highlight]="true" | ||||
|                 [discussionId]="discussionId" [component]="component" [componentId]="cmId" | ||||
|                 [formData]="formData" [originalData]="originalData" [forum]="forum" [accessInfo]="accessInfo" | ||||
|                 [trackPosts]="trackPosts" [ratingInfo]="ratingInfo" [leavingPage]="leavingPage" | ||||
|                 (onPostChange)="postListChanged()"> | ||||
|             <addon-mod-forum-post [post]="startingPost" [discussion]="discussion" [courseId]="courseId" [highlight]="true" | ||||
|                 [discussionId]="discussionId" [component]="component" [componentId]="cmId" [formData]="formData" | ||||
|                 [originalData]="originalData" [forum]="forum" [accessInfo]="accessInfo" [trackPosts]="trackPosts" [ratingInfo]="ratingInfo" | ||||
|                 [leavingPage]="leavingPage" (onPostChange)="postListChanged()"> | ||||
|             </addon-mod-forum-post> | ||||
|         </div> | ||||
| 
 | ||||
|         <ion-card *ngIf="sort != 'nested'"> | ||||
|             <ng-container *ngFor="let post of posts; first as first"> | ||||
|                 <core-spacer *ngIf="!first"></core-spacer> | ||||
|                 <addon-mod-forum-post | ||||
|                     [post]="post" [courseId]="courseId" [discussionId]="discussionId" | ||||
|                     [component]="component" [componentId]="cmId" [formData]="formData" | ||||
|                     [originalData]="originalData" [parentSubject]="postSubjects[post.parentid]" | ||||
|                 <addon-mod-forum-post [post]="post" [courseId]="courseId" [discussionId]="discussionId" [component]="component" | ||||
|                     [componentId]="cmId" [formData]="formData" [originalData]="originalData" [parentSubject]="postSubjects[post.parentid]" | ||||
|                     [forum]="forum" [accessInfo]="accessInfo" [trackPosts]="trackPosts" [ratingInfo]="ratingInfo" | ||||
|                     [leavingPage]="leavingPage" | ||||
|                     (onPostChange)="postListChanged()"> | ||||
|                     [leavingPage]="leavingPage" (onPostChange)="postListChanged()"> | ||||
|                 </addon-mod-forum-post> | ||||
|             </ng-container> | ||||
|         </ion-card> | ||||
| @ -121,12 +111,10 @@ | ||||
| 
 | ||||
|         <ng-template #nestedPosts let-post="post"> | ||||
|             <ion-card> | ||||
|                 <addon-mod-forum-post | ||||
|                     [post]="post" [courseId]="courseId" [discussionId]="discussionId" [component]="component" | ||||
|                     [componentId]="cmId" [formData]="formData" [originalData]="originalData" | ||||
|                     [parentSubject]="postSubjects[post.parentid]" [forum]="forum" [accessInfo]="accessInfo" | ||||
|                     [trackPosts]="trackPosts" [ratingInfo]="ratingInfo" [leavingPage]="leavingPage" | ||||
|                     (onPostChange)="postListChanged()"> | ||||
|                 <addon-mod-forum-post [post]="post" [courseId]="courseId" [discussionId]="discussionId" [component]="component" | ||||
|                     [componentId]="cmId" [formData]="formData" [originalData]="originalData" [parentSubject]="postSubjects[post.parentid]" | ||||
|                     [forum]="forum" [accessInfo]="accessInfo" [trackPosts]="trackPosts" [ratingInfo]="ratingInfo" | ||||
|                     [leavingPage]="leavingPage" (onPostChange)="postListChanged()"> | ||||
|                 </addon-mod-forum-post> | ||||
|             </ion-card> | ||||
|             <div class="ion-padding-start" *ngIf="post.children && post.children.length && post.children[0].subject"> | ||||
|  | ||||
| @ -3,10 +3,12 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1> | ||||
|             <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId"> | ||||
|             </core-format-text> | ||||
|         </h1> | ||||
|         <ion-title> | ||||
|             <h1> | ||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId"> | ||||
|                 </core-format-text> | ||||
|             </h1> | ||||
|         </ion-title> | ||||
|         <ion-buttons slot="end"> | ||||
|             <!-- The buttons defined by the component will be added in here. --> | ||||
|         </ion-buttons> | ||||
|  | ||||
| @ -3,7 +3,9 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1>{{ 'addon.mod_forum.addanewdiscussion' | translate }}</h1> | ||||
|         <ion-title> | ||||
|             <h1>{{ 'addon.mod_forum.addanewdiscussion' | translate }}</h1> | ||||
|         </ion-title> | ||||
|         <ion-buttons slot="end"> | ||||
|             <!-- The context menu will be added in here. --> | ||||
|         </ion-buttons> | ||||
| @ -18,9 +20,8 @@ | ||||
|         <form *ngIf="showForm" #newDiscFormEl> | ||||
|             <ion-item> | ||||
|                 <ion-label position="stacked">{{ 'addon.mod_forum.subject' | translate }}</ion-label> | ||||
|                 <ion-input | ||||
|                     [(ngModel)]="newDiscussion.subject" | ||||
|                     type="text" [placeholder]="'addon.mod_forum.subject' | translate" name="subject"> | ||||
|                 <ion-input [(ngModel)]="newDiscussion.subject" type="text" [placeholder]="'addon.mod_forum.subject' | translate" | ||||
|                     name="subject"> | ||||
|                 </ion-input> | ||||
|             </ion-item> | ||||
|             <ion-item> | ||||
| @ -31,19 +32,14 @@ | ||||
|                     (contentChanged)="onMessageChange($event)"> | ||||
|                 </core-rich-text-editor> | ||||
|             </ion-item> | ||||
|             <ion-item | ||||
|                 button | ||||
|                 class="divider ion-text-wrap" | ||||
|                 (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-item button class="divider ion-text-wrap" (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-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> | ||||
|             <div *ngIf="advanced" id="addon-mod-forum-new-discussion-advanced"> | ||||
|                 <ion-item *ngIf="showGroups && groupIds.length > 1 && accessInfo.cancanposttomygroups"> | ||||
| @ -66,17 +62,16 @@ | ||||
|                     <ion-label>{{ 'addon.mod_forum.discussionpinned' | translate }}</ion-label> | ||||
|                     <ion-toggle [(ngModel)]="newDiscussion.pin" name="pin"></ion-toggle> | ||||
|                 </ion-item> | ||||
|                 <core-attachments *ngIf="canCreateAttachments && forum && forum.maxattachments > 0" | ||||
|                     [files]="newDiscussion.files" [maxSize]="forum.maxbytes" [maxSubmissions]="forum.maxattachments" | ||||
|                     [component]="component" [componentId]="forum.cmid" [allowOffline]="true" [courseId]="courseId"> | ||||
|                 <core-attachments *ngIf="canCreateAttachments && forum && forum.maxattachments > 0" [files]="newDiscussion.files" | ||||
|                     [maxSize]="forum.maxbytes" [maxSubmissions]="forum.maxattachments" [component]="component" [componentId]="forum.cmid" | ||||
|                     [allowOffline]="true" [courseId]="courseId"> | ||||
|                 </core-attachments> | ||||
|             </div> | ||||
|             <ion-item> | ||||
|                 <ion-label> | ||||
|                     <ion-row> | ||||
|                         <ion-col> | ||||
|                             <ion-button | ||||
|                                 expand="block" [disabled]="newDiscussion.subject == '' || newDiscussion.message == null" | ||||
|                             <ion-button expand="block" [disabled]="newDiscussion.subject == '' || newDiscussion.message == null" | ||||
|                                 (click)="add()"> | ||||
|                                 {{ 'addon.mod_forum.posttoforum' | translate }} | ||||
|                             </ion-button> | ||||
|  | ||||
| @ -3,10 +3,12 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1 *ngIf="glossary"> | ||||
|             <core-format-text [text]="glossary.name" contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId"> | ||||
|             </core-format-text> | ||||
|         </h1> | ||||
|         <ion-title> | ||||
|             <h1 *ngIf="glossary"> | ||||
|                 <core-format-text [text]="glossary.name" contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId"> | ||||
|                 </core-format-text> | ||||
|             </h1> | ||||
|         </ion-title> | ||||
|     </ion-toolbar> | ||||
| </ion-header> | ||||
| <ion-content> | ||||
| @ -14,16 +16,15 @@ | ||||
|         <form #editFormEl *ngIf="glossary"> | ||||
|             <ion-item> | ||||
|                 <ion-label position="stacked">{{ 'addon.mod_glossary.concept' | translate }}</ion-label> | ||||
|                 <ion-input type="text" [placeholder]="'addon.mod_glossary.concept' | translate" [(ngModel)]="entry.concept" | ||||
|                     name="concept"> | ||||
|                 <ion-input type="text" [placeholder]="'addon.mod_glossary.concept' | translate" [(ngModel)]="entry.concept" name="concept"> | ||||
|                 </ion-input> | ||||
|             </ion-item> | ||||
|             <ion-item> | ||||
|                 <ion-label position="stacked">{{ 'addon.mod_glossary.definition' | translate }}</ion-label> | ||||
|                 <core-rich-text-editor [control]="definitionControl" (contentChanged)="onDefinitionChange($event)" | ||||
|                     [placeholder]="'addon.mod_glossary.definition' | translate" name="addon_mod_glossary_edit" | ||||
|                     [component]="component" [componentId]="cmId" [autoSave]="true" contextLevel="module" | ||||
|                     [contextInstanceId]="cmId" elementId="definition_editor" [draftExtraParams]="editorExtraParams"> | ||||
|                     [placeholder]="'addon.mod_glossary.definition' | translate" name="addon_mod_glossary_edit" [component]="component" | ||||
|                     [componentId]="cmId" [autoSave]="true" contextLevel="module" [contextInstanceId]="cmId" elementId="definition_editor" | ||||
|                     [draftExtraParams]="editorExtraParams"> | ||||
|                 </core-rich-text-editor> | ||||
|             </ion-item> | ||||
|             <ion-item *ngIf="categories.length > 0"> | ||||
| @ -47,14 +48,18 @@ | ||||
|                 </ion-textarea> | ||||
|             </ion-item> | ||||
|             <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> | ||||
|             <core-attachments [files]="attachments" [component]="component" [componentId]="glossary.coursemodule" | ||||
|                 [allowOffline]="true" [courseId]="courseId"> | ||||
|             <core-attachments [files]="attachments" [component]="component" [componentId]="glossary.coursemodule" [allowOffline]="true" | ||||
|                 [courseId]="courseId"> | ||||
|             </core-attachments> | ||||
|             <ng-container *ngIf="glossary.usedynalink"> | ||||
|                 <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 class="ion-text-wrap"> | ||||
|                     <ion-label>{{ 'addon.mod_glossary.entryusedynalink' | translate }}</ion-label> | ||||
|  | ||||
| @ -3,10 +3,12 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1 *ngIf="entry"> | ||||
|             <core-format-text [text]="entry.concept" contextLevel="module" [contextInstanceId]="componentId" [courseId]="courseId"> | ||||
|             </core-format-text> | ||||
|         </h1> | ||||
|         <ion-title> | ||||
|             <h1 *ngIf="entry"> | ||||
|                 <core-format-text [text]="entry.concept" contextLevel="module" [contextInstanceId]="componentId" [courseId]="courseId"> | ||||
|                 </core-format-text> | ||||
|             </h1> | ||||
|         </ion-title> | ||||
|     </ion-toolbar> | ||||
| </ion-header> | ||||
| <ion-content> | ||||
| @ -39,14 +41,13 @@ | ||||
|             </ion-item> | ||||
|             <ion-item class="ion-text-wrap"> | ||||
|                 <ion-label> | ||||
|                     <core-format-text [component]="component" [componentId]="componentId" [text]="entry.definition" | ||||
|                         contextLevel="module" [contextInstanceId]="componentId" [courseId]="courseId"> | ||||
|                     <core-format-text [component]="component" [componentId]="componentId" [text]="entry.definition" contextLevel="module" | ||||
|                         [contextInstanceId]="componentId" [courseId]="courseId"> | ||||
|                     </core-format-text> | ||||
|                 </ion-label> | ||||
|             </ion-item> | ||||
|             <div *ngIf="entry.attachment" lines="none"> | ||||
|                 <core-file *ngFor="let file of entry.attachments" [file]="file" [component]="component" | ||||
|                     [componentId]="componentId"> | ||||
|                 <core-file *ngFor="let file of entry.attachments" [file]="file" [component]="component" [componentId]="componentId"> | ||||
|                 </core-file> | ||||
|             </div> | ||||
|             <ion-item class="ion-text-wrap" *ngIf="tagsEnabled && entry && entry.tags && entry.tags.length > 0"> | ||||
| @ -56,20 +57,21 @@ | ||||
|                 </ion-label> | ||||
|             </ion-item> | ||||
|             <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> | ||||
|             <core-comments *ngIf="glossary && glossary.allowcomments && entry && entry.id > 0 && commentsEnabled" | ||||
|                 contextLevel="module" [instanceId]="glossary.coursemodule" component="mod_glossary" | ||||
|                 [itemId]="entry.id" area="glossary_entry" [courseId]="glossary.course" [showItem]="true"> | ||||
|             <core-comments *ngIf="glossary && glossary.allowcomments && entry && entry.id > 0 && commentsEnabled" contextLevel="module" | ||||
|                 [instanceId]="glossary.coursemodule" component="mod_glossary" [itemId]="entry.id" area="glossary_entry" | ||||
|                 [courseId]="glossary.course" [showItem]="true"> | ||||
|             </core-comments> | ||||
|             <core-rating-rate *ngIf="glossary && ratingInfo" [ratingInfo]="ratingInfo" contextLevel="module" | ||||
|                 [instanceId]="glossary.coursemodule" [itemId]="entry.id" [itemSetId]="0" [courseId]="glossary.course" | ||||
|                 [aggregateMethod]="glossary.assessed" [scaleId]="glossary.scale" [userId]="entry.userid" | ||||
|                 (onUpdate)="ratingUpdated()"> | ||||
|                 [aggregateMethod]="glossary.assessed" [scaleId]="glossary.scale" [userId]="entry.userid" (onUpdate)="ratingUpdated()"> | ||||
|             </core-rating-rate> | ||||
|             <core-rating-aggregate *ngIf="glossary && ratingInfo" [ratingInfo]="ratingInfo" contextLevel="module" | ||||
|                 [instanceId]="glossary.coursemodule" [itemId]="entry.id" [courseId]="glossary.course" | ||||
|                 [aggregateMethod]="glossary.assessed" [scaleId]="glossary.scale"> | ||||
|                 [instanceId]="glossary.coursemodule" [itemId]="entry.id" [courseId]="glossary.course" [aggregateMethod]="glossary.assessed" | ||||
|                 [scaleId]="glossary.scale"> | ||||
|             </core-rating-aggregate> | ||||
|         </ng-container> | ||||
| 
 | ||||
|  | ||||
| @ -3,10 +3,12 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1> | ||||
|             <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> | ||||
|             </core-format-text> | ||||
|         </h1> | ||||
|         <ion-title> | ||||
|             <h1> | ||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> | ||||
|                 </core-format-text> | ||||
|             </h1> | ||||
|         </ion-title> | ||||
|         <ion-buttons slot="end"> | ||||
|             <!-- The buttons defined by the component will be added in here. --> | ||||
|         </ion-buttons> | ||||
|  | ||||
| @ -3,11 +3,13 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1> | ||||
|             <core-format-text *ngIf="h5pActivity" [text]="h5pActivity.name" contextLevel="module" | ||||
|                 [contextInstanceId]="h5pActivity.coursemodule" [courseId]="courseId"> | ||||
|             </core-format-text> | ||||
|         </h1> | ||||
|         <ion-title> | ||||
|             <h1> | ||||
|                 <core-format-text *ngIf="h5pActivity" [text]="h5pActivity.name" contextLevel="module" | ||||
|                     [contextInstanceId]="h5pActivity.coursemodule" [courseId]="courseId"> | ||||
|                 </core-format-text> | ||||
|             </h1> | ||||
|         </ion-title> | ||||
|     </ion-toolbar> | ||||
| </ion-header> | ||||
| <ion-content> | ||||
| @ -62,15 +64,15 @@ | ||||
|                     <ion-item class="ion-text-wrap" lines="none"> | ||||
|                         <ion-label> | ||||
|                             <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> | ||||
|                                 {{ 'addon.mod_h5pactivity.attempt_success_pass' | translate }} | ||||
|                             </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> | ||||
|                                 {{ 'addon.mod_h5pactivity.attempt_success_fail' | translate }} | ||||
|                             </p> | ||||
|                             <p *ngIf="attempt.success === null" > | ||||
|                             <p *ngIf="attempt.success === null"> | ||||
|                                 {{ 'addon.mod_h5pactivity.attempt_success_unknown' | translate }} | ||||
|                             </p> | ||||
|                         </ion-label> | ||||
| @ -89,15 +91,15 @@ | ||||
|                 <ion-card *ngFor="let result of attempt.results"> | ||||
|                     <ion-card-header class="ion-text-wrap"> | ||||
|                         <ion-card-title> | ||||
|                             <core-format-text [text]="result.description" [component]="component" [componentId]="cmId" | ||||
|                                 contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId"> | ||||
|                             <core-format-text [text]="result.description" [component]="component" [componentId]="cmId" contextLevel="module" | ||||
|                                 [contextInstanceId]="cmId" [courseId]="courseId"> | ||||
|                             </core-format-text> | ||||
|                         </ion-card-title> | ||||
|                     </ion-card-header> | ||||
|                     <ion-item *ngIf="result.content" class="ion-text-wrap"> | ||||
|                         <ion-label> | ||||
|                             <core-format-text [text]="result.content" [component]="component" [componentId]="cmId" | ||||
|                                 contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId"> | ||||
|                             <core-format-text [text]="result.content" [component]="component" [componentId]="cmId" contextLevel="module" | ||||
|                                 [contextInstanceId]="cmId" [courseId]="courseId"> | ||||
|                             </core-format-text> | ||||
|                         </ion-label> | ||||
|                     </ion-item> | ||||
| @ -113,8 +115,7 @@ | ||||
|                                 </ion-row> | ||||
|                             </ion-label> | ||||
|                         </ion-item> | ||||
|                         <ion-item *ngFor="let option of result.options" | ||||
|                             class="ion-text-wrap addon-mod_h5pactivity-result-table-row"> | ||||
|                         <ion-item *ngFor="let option of result.options" class="ion-text-wrap addon-mod_h5pactivity-result-table-row"> | ||||
|                             <ion-label> | ||||
|                                 <ion-row class="ion-align-items-center"> | ||||
|                                     <ion-col class="ion-text-center"> | ||||
| @ -124,8 +125,7 @@ | ||||
|                                     </ion-col> | ||||
|                                     <ion-col class="ion-text-center"> | ||||
|                                         <ng-container *ngIf="option.correctanswer"> | ||||
|                                             <ng-container | ||||
|                                                 *ngTemplateOutlet="answerTemplate; context: {answer: option.correctanswer}"> | ||||
|                                             <ng-container *ngTemplateOutlet="answerTemplate; context: {answer: option.correctanswer}"> | ||||
|                                             </ng-container> | ||||
|                                         </ng-container> | ||||
|                                     </ion-col> | ||||
| @ -143,9 +143,9 @@ | ||||
|                         <ion-item *ngIf="result.maxscore" class="ion-text-wrap ion-text-end addon-mod_h5pactivity-result-score"> | ||||
|                             <ion-label> | ||||
|                                 <p><strong> | ||||
|                                     {{ 'addon.mod_h5pactivity.score' | translate }}: | ||||
|                                      {{ 'addon.mod_h5pactivity.score_out_of' | translate:{$a: result} }} | ||||
|                                 </strong></p> | ||||
|                                         {{ 'addon.mod_h5pactivity.score' | translate }}: | ||||
|                                         {{ 'addon.mod_h5pactivity.score_out_of' | translate:{$a: result} }} | ||||
|                                     </strong></p> | ||||
|                             </ion-label> | ||||
|                         </ion-item> | ||||
|                     </ng-container> | ||||
|  | ||||
| @ -3,10 +3,12 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1> | ||||
|             <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId"> | ||||
|             </core-format-text> | ||||
|         </h1> | ||||
|         <ion-title> | ||||
|             <h1> | ||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId"> | ||||
|                 </core-format-text> | ||||
|             </h1> | ||||
|         </ion-title> | ||||
| 
 | ||||
|         <ion-buttons slot="end"> | ||||
|             <!-- The buttons defined by the component will be added in here. --> | ||||
|  | ||||
| @ -3,11 +3,13 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1> | ||||
|             <core-format-text *ngIf="h5pActivity" [text]="h5pActivity.name" contextLevel="module" | ||||
|                 [contextInstanceId]="h5pActivity.coursemodule" [courseId]="courseId"> | ||||
|             </core-format-text> | ||||
|         </h1> | ||||
|         <ion-title> | ||||
|             <h1> | ||||
|                 <core-format-text *ngIf="h5pActivity" [text]="h5pActivity.name" contextLevel="module" | ||||
|                     [contextInstanceId]="h5pActivity.coursemodule" [courseId]="courseId"> | ||||
|                 </core-format-text> | ||||
|             </h1> | ||||
|         </ion-title> | ||||
|     </ion-toolbar> | ||||
| </ion-header> | ||||
| <ion-content> | ||||
|  | ||||
| @ -3,11 +3,13 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1> | ||||
|             <core-format-text *ngIf="h5pActivity" [text]="h5pActivity.name" contextLevel="module" | ||||
|                 [contextInstanceId]="h5pActivity.coursemodule" [courseId]="courseId"> | ||||
|             </core-format-text> | ||||
|         </h1> | ||||
|         <ion-title> | ||||
|             <h1> | ||||
|                 <core-format-text *ngIf="h5pActivity" [text]="h5pActivity.name" contextLevel="module" | ||||
|                     [contextInstanceId]="h5pActivity.coursemodule" [courseId]="courseId"> | ||||
|                 </core-format-text> | ||||
|             </h1> | ||||
|         </ion-title> | ||||
|     </ion-toolbar> | ||||
| </ion-header> | ||||
| <ion-content> | ||||
|  | ||||
| @ -1,6 +1,8 @@ | ||||
| <ion-header> | ||||
|     <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-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate"> | ||||
|                 <ion-icon name="fas-times" slot="icon-only" aria-hidden=true></ion-icon> | ||||
|  | ||||
| @ -3,10 +3,12 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1> | ||||
|             <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> | ||||
|             </core-format-text> | ||||
|         </h1> | ||||
|         <ion-title> | ||||
|             <h1> | ||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> | ||||
|                 </core-format-text> | ||||
|             </h1> | ||||
|         </ion-title> | ||||
| 
 | ||||
|         <ion-buttons slot="end"> | ||||
|             <!-- The buttons defined by the component will be added in here. --> | ||||
|  | ||||
| @ -1,7 +1,8 @@ | ||||
| <ion-header> | ||||
|     <ion-toolbar> | ||||
|         <h2>{{ pageInstance?.lesson?.name }}</h2> | ||||
| 
 | ||||
|         <ion-title> | ||||
|             <h2>{{ pageInstance?.lesson?.name }}</h2> | ||||
|         </ion-title> | ||||
|         <ion-buttons slot="end"> | ||||
|             <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> | ||||
| @ -15,7 +16,9 @@ | ||||
|             <!-- Media file. --> | ||||
|             <ng-container *ngIf="pageInstance.mediaFile"> | ||||
|                 <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> | ||||
|                 <core-file [file]="pageInstance.mediaFile" [component]="pageInstance.component" | ||||
|                     [componentId]="pageInstance.lesson?.coursemodule"> | ||||
| @ -25,16 +28,20 @@ | ||||
|             <!-- Lesson menu. --> | ||||
|             <ng-container *ngIf="pageInstance.displayMenu"> | ||||
|                 <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 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> | ||||
|                 <div *ngIf="!pageInstance.loadingMenu"> | ||||
|                     <ng-container *ngFor="let page of pageInstance.lessonPages"> | ||||
|                         <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'" | ||||
|                             button detail="true"> | ||||
|                             [attr.aria-current]="!pageInstance.eolData && pageInstance.currentPage == page.id ? 'page' : 'false'" button | ||||
|                             detail="true"> | ||||
|                             <ion-label> | ||||
|                                 <core-format-text [text]="page.title" contextLevel="module" [courseId]="pageInstance.courseId" | ||||
|                                     [contextInstanceId]="pageInstance.lesson?.coursemodule"> | ||||
|  | ||||
| @ -1,7 +1,8 @@ | ||||
| <ion-header> | ||||
|     <ion-toolbar> | ||||
|         <h2>{{ 'core.login.password' | translate }}</h2> | ||||
| 
 | ||||
|         <ion-title> | ||||
|             <h2>{{ 'core.login.password' | translate }}</h2> | ||||
|         </ion-title> | ||||
|         <ion-buttons slot="end"> | ||||
|             <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> | ||||
| @ -14,8 +15,8 @@ | ||||
|         <ion-item> | ||||
|             <ion-label>{{ 'addon.mod_lesson.enterpassword' | translate }}</ion-label> | ||||
|             <core-show-password name="password"> | ||||
|                 <ion-input name="password" type="password" placeholder="{{ 'core.login.password' | translate }}" | ||||
|                     core-auto-focus #passwordinput [clearOnEdit]="false"> | ||||
|                 <ion-input name="password" type="password" placeholder="{{ 'core.login.password' | translate }}" core-auto-focus | ||||
|                     #passwordinput [clearOnEdit]="false"> | ||||
|                 </ion-input> | ||||
|             </core-show-password> | ||||
|         </ion-item> | ||||
|  | ||||
| @ -3,10 +3,12 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1> | ||||
|             <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> | ||||
|             </core-format-text> | ||||
|         </h1> | ||||
|         <ion-title> | ||||
|             <h1> | ||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> | ||||
|                 </core-format-text> | ||||
|             </h1> | ||||
|         </ion-title> | ||||
|         <ion-buttons slot="end"> | ||||
|             <!-- The buttons defined by the component will be added in here. --> | ||||
|         </ion-buttons> | ||||
|  | ||||
| @ -3,11 +3,12 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1> | ||||
|             <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="lesson?.coursemodule" | ||||
|                 [courseId]="courseId"> | ||||
|             </core-format-text> | ||||
|         </h1> | ||||
|         <ion-title> | ||||
|             <h1> | ||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="lesson?.coursemodule" [courseId]="courseId"> | ||||
|                 </core-format-text> | ||||
|             </h1> | ||||
|         </ion-title> | ||||
|         <ion-buttons slot="end"> | ||||
|             <ion-button fill="clear" *ngIf="displayMenu || mediaFile" [attr.aria-label]="'addon.mod_lesson.lessonmenu' | translate" | ||||
|                 (click)="showMenu()"> | ||||
| @ -46,15 +47,14 @@ | ||||
|             <ion-card *ngIf="!eolData && !processData"> | ||||
|                 <!-- Content page. --> | ||||
|                 <ion-item class="ion-text-wrap" *ngIf="!question && pageContent"> | ||||
|                     <core-format-text [component]="component" [componentId]="lesson.coursemodule" [text]="pageContent" | ||||
|                         contextLevel="module" [contextInstanceId]="lesson.coursemodule" [courseId]="courseId"> | ||||
|                     <core-format-text [component]="component" [componentId]="lesson.coursemodule" [text]="pageContent" contextLevel="module" | ||||
|                         [contextInstanceId]="lesson.coursemodule" [courseId]="courseId"> | ||||
|                     </core-format-text> | ||||
|                 </ion-item> | ||||
| 
 | ||||
|                 <!-- Question page. --> | ||||
|                 <!-- 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 | ||||
|                     (ngSubmit)="submitQuestion($event)"> | ||||
|                 <form *ngIf="question && loaded" [formGroup]="questionForm" #questionFormEl (ngSubmit)="submitQuestion($event)"> | ||||
| 
 | ||||
|                     <ion-item-divider class="ion-text-wrap" *ngIf="pageContent"> | ||||
|                         <ion-label> | ||||
| @ -91,8 +91,8 @@ | ||||
|                                     <h3 class="item-heading">{{ 'addon.mod_lesson.youranswer' | translate }}</h3> | ||||
|                                     <p> | ||||
|                                         <core-format-text [component]="component" [componentId]="lesson?.coursemodule" | ||||
|                                             [text]="question.useranswer" contextLevel="module" | ||||
|                                             [contextInstanceId]="lesson?.coursemodule" [courseId]="courseId"> | ||||
|                                             [text]="question.useranswer" contextLevel="module" [contextInstanceId]="lesson?.coursemodule" | ||||
|                                             [courseId]="courseId"> | ||||
|                                         </core-format-text> | ||||
|                                     </p> | ||||
|                                 </ion-label> | ||||
| @ -105,9 +105,8 @@ | ||||
|                             <ion-radio-group *ngIf="!question.multi" [formControlName]="question.controlName"> | ||||
|                                 <ion-item class="ion-text-wrap" *ngFor="let option of question.options"> | ||||
|                                     <ion-label> | ||||
|                                         <core-format-text [component]="component" [componentId]="lesson.coursemodule" | ||||
|                                             [text]="option.text" contextLevel="module" [contextInstanceId]="lesson?.coursemodule" | ||||
|                                             [courseId]="courseId"> | ||||
|                                         <core-format-text [component]="component" [componentId]="lesson.coursemodule" [text]="option.text" | ||||
|                                             contextLevel="module" [contextInstanceId]="lesson?.coursemodule" [courseId]="courseId"> | ||||
|                                         </core-format-text> | ||||
|                                     </ion-label> | ||||
|                                     <ion-radio slot="end" [id]="option.id" [value]="option.value" [disabled]="option.disabled"> | ||||
| @ -119,9 +118,8 @@ | ||||
|                             <ng-container *ngIf="question.multi"> | ||||
|                                 <ion-item class="ion-text-wrap" *ngFor="let option of question.options"> | ||||
|                                     <ion-label> | ||||
|                                         <core-format-text [component]="component" [componentId]="lesson?.coursemodule" | ||||
|                                             [text]="option.text" contextLevel="module" [contextInstanceId]="lesson?.coursemodule" | ||||
|                                             [courseId]="courseId"> | ||||
|                                         <core-format-text [component]="component" [componentId]="lesson?.coursemodule" [text]="option.text" | ||||
|                                             contextLevel="module" [contextInstanceId]="lesson?.coursemodule" [courseId]="courseId"> | ||||
|                                         </core-format-text> | ||||
|                                     </ion-label> | ||||
|                                     <ion-checkbox [id]="option.id" [formControlName]="option.name" slot="end"></ion-checkbox> | ||||
| @ -133,10 +131,12 @@ | ||||
|                         <ng-container *ngSwitchCase="'matching'"> | ||||
|                             <ion-item class="ion-text-wrap" *ngFor="let row of question.rows"> | ||||
|                                 <ion-label> | ||||
|                                     <p><core-format-text id="addon-mod_lesson-matching-{{row.id}}" [component]="component" | ||||
|                                         [componentId]="lesson?.coursemodule" [text]="row.text" contextLevel="module" | ||||
|                                         [contextInstanceId]="lesson?.coursemodule" [courseId]="courseId"> | ||||
|                                     </core-format-text></p> | ||||
|                                     <p> | ||||
|                                         <core-format-text id="addon-mod_lesson-matching-{{row.id}}" [component]="component" | ||||
|                                             [componentId]="lesson?.coursemodule" [text]="row.text" contextLevel="module" | ||||
|                                             [contextInstanceId]="lesson?.coursemodule" [courseId]="courseId"> | ||||
|                                         </core-format-text> | ||||
|                                     </p> | ||||
|                                 </ion-label> | ||||
|                                 <ion-select [id]="row.id" [formControlName]="row.name" interface="action-sheet" | ||||
|                                     [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-row class="ion-align-items-center"> | ||||
|                         <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" | ||||
|                                 (click)="buttonClicked(button.data)" class="ion-text-wrap button-no-uppercase"> | ||||
|                             <ion-button expand="block" fill="outline" [id]="button.id" (click)="buttonClicked(button.data)" | ||||
|                                 class="ion-text-wrap button-no-uppercase"> | ||||
|                                 {{ button.content }} | ||||
|                             </ion-button> | ||||
|                         </ion-col> | ||||
| @ -213,8 +213,7 @@ | ||||
|                 <ion-item class="ion-text-wrap" *ngIf="eolData.displayscorewithessays" lines="none"> | ||||
|                     <ion-label [innerHTML]="eolData.displayscorewithessays.message"></ion-label> | ||||
|                 </ion-item> | ||||
|                 <ion-item class="ion-text-wrap" *ngIf="!eolData.displayscorewithessays && eolData.displayscorewithoutessays" | ||||
|                     lines="none"> | ||||
|                 <ion-item class="ion-text-wrap" *ngIf="!eolData.displayscorewithessays && eolData.displayscorewithoutessays" lines="none"> | ||||
|                     <ion-label>{{ eolData.displayscorewithoutessays.message }}</ion-label> | ||||
|                 </ion-item> | ||||
|                 <ion-item class="ion-text-wrap" *ngIf="eolData.yourcurrentgradeisoutof" lines="none"> | ||||
| @ -247,19 +246,17 @@ | ||||
|                     <ion-label>{{ eolData.modattemptsnoteacher.message }}</ion-label> | ||||
|                 </ion-item> | ||||
|                 <!-- If activity link was successfully formatted, render the button. --> | ||||
|                 <ion-button *ngIf="activityLink && activityLink.formatted" | ||||
|                     expand="block" color="light" [href]="activityLink.href" core-link [capture]="true" | ||||
|                     class="ion-text-wrap ion-margin button-no-uppercase"> | ||||
|                     <core-format-text [text]="activityLink.label" contextLevel="module" | ||||
|                         [contextInstanceId]="lesson?.coursemodule" [courseId]="courseId"> | ||||
|                 <ion-button *ngIf="activityLink && activityLink.formatted" expand="block" color="light" [href]="activityLink.href" core-link | ||||
|                     [capture]="true" class="ion-text-wrap ion-margin button-no-uppercase"> | ||||
|                     <core-format-text [text]="activityLink.label" contextLevel="module" [contextInstanceId]="lesson?.coursemodule" | ||||
|                         [courseId]="courseId"> | ||||
|                     </core-format-text> | ||||
|                 </ion-button> | ||||
|                 <ion-item class="ion-text-wrap" *ngIf="activityLink && !activityLink.formatted" | ||||
|                     lines="none"> | ||||
|                 <ion-item class="ion-text-wrap" *ngIf="activityLink && !activityLink.formatted" lines="none"> | ||||
|                     <!-- Activity link wasn't formatted, render the original link. --> | ||||
|                     <ion-label> | ||||
|                         <core-format-text [text]="activityLink.label" contextLevel="module" | ||||
|                             [contextInstanceId]="lesson?.coursemodule" [courseId]="courseId"> | ||||
|                         <core-format-text [text]="activityLink.label" contextLevel="module" [contextInstanceId]="lesson?.coursemodule" | ||||
|                             [courseId]="courseId"> | ||||
|                         </core-format-text> | ||||
|                     </ion-label> | ||||
|                 </ion-item> | ||||
| @ -267,15 +264,14 @@ | ||||
| 
 | ||||
|             <!-- Feedback returned when processing an action. --> | ||||
|             <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-item> | ||||
|                 <ion-item class="ion-text-wrap" *ngIf="!processData.reviewmode || review"> | ||||
|                     <ion-label> | ||||
|                         <div *ngIf="!processData.reviewmode"> | ||||
|                             <core-format-text [component]="component" [componentId]="lesson?.coursemodule" | ||||
|                                 [text]="processData.feedback" contextLevel="module" [contextInstanceId]="lesson?.coursemodule" | ||||
|                                 [courseId]="courseId"> | ||||
|                             <core-format-text [component]="component" [componentId]="lesson?.coursemodule" [text]="processData.feedback" | ||||
|                                 contextLevel="module" [contextInstanceId]="lesson?.coursemodule" [courseId]="courseId"> | ||||
|                             </core-format-text> | ||||
|                         </div> | ||||
|                         <div *ngIf="review"> | ||||
| @ -286,8 +282,7 @@ | ||||
|                     </ion-label> | ||||
|                 </ion-item> | ||||
| 
 | ||||
|                 <ion-button expand="block" class="ion-text-wrap ion-margin" color="light" *ngIf="review" | ||||
|                     (click)="changePage(LESSON_EOL)"> | ||||
|                 <ion-button expand="block" class="ion-text-wrap ion-margin" color="light" *ngIf="review" (click)="changePage(LESSON_EOL)"> | ||||
|                     {{ 'addon.mod_lesson.finish' | translate }} | ||||
|                 </ion-button> | ||||
|                 <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-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1>{{ 'addon.mod_lesson.detailedstats' | translate }}</h1> | ||||
|         <ion-title> | ||||
|             <h1>{{ 'addon.mod_lesson.detailedstats' | translate }}</h1> | ||||
|         </ion-title> | ||||
|     </ion-toolbar> | ||||
| </ion-header> | ||||
| <ion-content> | ||||
| @ -133,8 +135,8 @@ | ||||
|                                     <ion-label> | ||||
|                                         <p> | ||||
|                                             <core-format-text [component]="component" [componentId]="lesson?.coursemodule" | ||||
|                                                 [text]="answer[0].content" contextLevel="module" | ||||
|                                                 [contextInstanceId]="lesson?.coursemodule" [courseId]="courseId"> | ||||
|                                                 [text]="answer[0].content" contextLevel="module" [contextInstanceId]="lesson?.coursemodule" | ||||
|                                                 [courseId]="courseId"> | ||||
|                                             </core-format-text> | ||||
|                                         </p> | ||||
|                                         <ion-badge *ngIf="answer[1]" color="dark"> | ||||
| @ -144,8 +146,7 @@ | ||||
|                                             </core-format-text> | ||||
|                                         </ion-badge> | ||||
|                                     </ion-label> | ||||
|                                     <ion-checkbox [attr.name]="answer[0].name" [ngModel]="answer[0].checked" [disabled]="true" | ||||
|                                         slot="end"> | ||||
|                                     <ion-checkbox [attr.name]="answer[0].name" [ngModel]="answer[0].checked" [disabled]="true" slot="end"> | ||||
|                                     </ion-checkbox> | ||||
|                                 </ion-item> | ||||
| 
 | ||||
| @ -213,15 +214,13 @@ | ||||
|                                 <!-- Another page (end of branch, ...). --> | ||||
|                                 <ion-label> | ||||
|                                     <p> | ||||
|                                         <core-format-text [component]="component" [componentId]="lesson?.coursemodule" | ||||
|                                             [text]="answer[0]" contextLevel="module" [contextInstanceId]="lesson?.coursemodule" | ||||
|                                             [courseId]="courseId"> | ||||
|                                         <core-format-text [component]="component" [componentId]="lesson?.coursemodule" [text]="answer[0]" | ||||
|                                             contextLevel="module" [contextInstanceId]="lesson?.coursemodule" [courseId]="courseId"> | ||||
|                                         </core-format-text> | ||||
|                                     </p> | ||||
|                                     <ion-badge *ngIf="answer[1]" color="dark"> | ||||
|                                         <core-format-text [component]="component" [componentId]="lesson?.coursemodule" | ||||
|                                             [text]="answer[1]" contextLevel="module" [contextInstanceId]="lesson?.coursemodule" | ||||
|                                             [courseId]="courseId"> | ||||
|                                         <core-format-text [component]="component" [componentId]="lesson?.coursemodule" [text]="answer[1]" | ||||
|                                             contextLevel="module" [contextInstanceId]="lesson?.coursemodule" [courseId]="courseId"> | ||||
|                                         </core-format-text> | ||||
|                                     </ion-badge> | ||||
|                                 </ion-label> | ||||
| @ -233,14 +232,16 @@ | ||||
|                                 <h3 class="item-heading">{{ 'addon.mod_lesson.response' | translate }}</h3> | ||||
|                                 <p> | ||||
|                                     <core-format-text [component]="component" [componentId]="lesson?.coursemodule" | ||||
|                                         [text]="page.answerdata.response" contextLevel="module" | ||||
|                                         [contextInstanceId]="lesson?.coursemodule" [courseId]="courseId"> | ||||
|                                         [text]="page.answerdata.response" contextLevel="module" [contextInstanceId]="lesson?.coursemodule" | ||||
|                                         [courseId]="courseId"> | ||||
|                                     </core-format-text> | ||||
|                                 </p> | ||||
|                             </ion-label> | ||||
|                         </ion-item> | ||||
|                         <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> | ||||
|                     </div> | ||||
|                 </ion-card> | ||||
|  | ||||
| @ -3,10 +3,12 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1> | ||||
|             <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId"> | ||||
|             </core-format-text> | ||||
|         </h1> | ||||
|         <ion-title> | ||||
|             <h1> | ||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId"> | ||||
|                 </core-format-text> | ||||
|             </h1> | ||||
|         </ion-title> | ||||
| 
 | ||||
|         <ion-buttons slot="end"> | ||||
|             <!-- The buttons defined by the component will be added in here. --> | ||||
|  | ||||
| @ -3,10 +3,12 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1> | ||||
|             <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> | ||||
|             </core-format-text> | ||||
|         </h1> | ||||
|         <ion-title> | ||||
|             <h1> | ||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> | ||||
|                 </core-format-text> | ||||
|             </h1> | ||||
|         </ion-title> | ||||
|         <ion-buttons slot="end"> | ||||
|             <!-- The buttons defined by the component will be added in here. --> | ||||
|         </ion-buttons> | ||||
|  | ||||
| @ -1,7 +1,8 @@ | ||||
| <ion-header> | ||||
|     <ion-toolbar> | ||||
|         <h2>{{ 'addon.mod_quiz.quiznavigation' | translate }}</h2> | ||||
| 
 | ||||
|         <ion-title> | ||||
|             <h2>{{ 'addon.mod_quiz.quiznavigation' | translate }}</h2> | ||||
|         </ion-title> | ||||
|         <ion-buttons slot="end"> | ||||
|             <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> | ||||
| @ -41,12 +42,12 @@ | ||||
|                 <ion-icon *ngIf="question.stateClass == 'core-question-correct'" name="fas-check" color="success" | ||||
|                     [attr.aria-label]="question.status" slot="end"> | ||||
|                 </ion-icon> | ||||
|                 <ion-icon *ngIf="question.stateClass == 'core-question-partiallycorrect'" name="fas-check-square" | ||||
|                     color="warning" [attr.aria-label]="question.status" slot="end"> | ||||
|                 <ion-icon *ngIf="question.stateClass == 'core-question-partiallycorrect'" name="fas-check-square" color="warning" | ||||
|                     [attr.aria-label]="question.status" slot="end"> | ||||
|                 </ion-icon> | ||||
|                 <ion-icon *ngIf="question.stateClass == 'core-question-incorrect' || | ||||
|                     question.stateClass == 'core-question-notanswered'" name="fas-times" color="danger" | ||||
|                     [attr.aria-label]="question.status" slot="end"> | ||||
|                     question.stateClass == 'core-question-notanswered'" name="fas-times" color="danger" [attr.aria-label]="question.status" | ||||
|                     slot="end"> | ||||
|                 </ion-icon> | ||||
|             </ion-item> | ||||
| 
 | ||||
|  | ||||
| @ -1,7 +1,8 @@ | ||||
| <ion-header> | ||||
|     <ion-toolbar> | ||||
|         <h2>{{ title | translate }}</h2> | ||||
| 
 | ||||
|         <ion-title> | ||||
|             <h2>{{ title | translate }}</h2> | ||||
|         </ion-title> | ||||
|         <ion-buttons slot="end"> | ||||
|             <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> | ||||
|  | ||||
| @ -3,11 +3,13 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1> | ||||
|             <core-format-text *ngIf="quiz" [text]="quiz.name" contextLevel="module" [contextInstanceId]="quiz.coursemodule" | ||||
|                 [courseId]="courseId"> | ||||
|             </core-format-text> | ||||
|         </h1> | ||||
|         <ion-title> | ||||
|             <h1> | ||||
|                 <core-format-text *ngIf="quiz" [text]="quiz.name" contextLevel="module" [contextInstanceId]="quiz.coursemodule" | ||||
|                     [courseId]="courseId"> | ||||
|                 </core-format-text> | ||||
|             </h1> | ||||
|         </ion-title> | ||||
|     </ion-toolbar> | ||||
| </ion-header> | ||||
| <ion-content> | ||||
| @ -45,8 +47,8 @@ | ||||
|                 <ion-label> | ||||
|                     <h2>{{ 'addon.mod_quiz.feedback' | translate }}</h2> | ||||
|                     <p> | ||||
|                         <core-format-text [component]="component" [componentId]="componentId" [text]="feedback" | ||||
|                             contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId"> | ||||
|                         <core-format-text [component]="component" [componentId]="componentId" [text]="feedback" contextLevel="module" | ||||
|                             [contextInstanceId]="cmId" [courseId]="courseId"> | ||||
|                         </core-format-text> | ||||
|                     </p> | ||||
|                 </ion-label> | ||||
|  | ||||
| @ -3,10 +3,12 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1> | ||||
|             <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> | ||||
|             </core-format-text> | ||||
|         </h1> | ||||
|         <ion-title> | ||||
|             <h1> | ||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> | ||||
|                 </core-format-text> | ||||
|             </h1> | ||||
|         </ion-title> | ||||
| 
 | ||||
|         <ion-buttons slot="end"> | ||||
|             <!-- The buttons defined by the component will be added in here. --> | ||||
|  | ||||
| @ -3,11 +3,13 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1> | ||||
|             <core-format-text *ngIf="quiz" [text]="quiz.name" contextLevel="module" [contextInstanceId]="quiz.coursemodule" | ||||
|                 [courseId]="courseId"> | ||||
|             </core-format-text> | ||||
|         </h1> | ||||
|         <ion-title> | ||||
|             <h1> | ||||
|                 <core-format-text *ngIf="quiz" [text]="quiz.name" contextLevel="module" [contextInstanceId]="quiz.coursemodule" | ||||
|                     [courseId]="courseId"> | ||||
|                 </core-format-text> | ||||
|             </h1> | ||||
|         </ion-title> | ||||
| 
 | ||||
|         <ion-buttons slot="end"> | ||||
|             <ion-button fill="clear" id="addon-mod_quiz-connection-error-button" [hidden]="!autoSaveError" | ||||
| @ -15,8 +17,7 @@ | ||||
|                 aria-haspopup="dialog"> | ||||
|                 <ion-icon name="fas-exclamation-circle" slot="icon-only" aria-hidden="true"></ion-icon> | ||||
|             </ion-button> | ||||
|             <ion-button *ngIf="navigation.length" [attr.aria-label]="'addon.mod_quiz.opentoc' | translate" | ||||
|                 (click)="openNavigation()"> | ||||
|             <ion-button *ngIf="navigation.length" [attr.aria-label]="'addon.mod_quiz.opentoc' | translate" (click)="openNavigation()"> | ||||
|                 <ion-icon name="fas-bookmark" slot="icon-only" aria-hidden="true"></ion-icon> | ||||
|             </ion-button> | ||||
|         </ion-buttons> | ||||
| @ -24,8 +25,7 @@ | ||||
|     <!-- Navigation arrows and time left. --> | ||||
|     <ion-toolbar *ngIf="loaded && endTime && questions.length && !quizAborted && !showSummary" color="light"> | ||||
|         <ion-title> | ||||
|             <core-timer [endTime]="endTime" (finished)="timeUp()" [timerText]="'addon.mod_quiz.timeleft' | translate" | ||||
|                 [align]="'center'"> | ||||
|             <core-timer [endTime]="endTime" (finished)="timeUp()" [timerText]="'addon.mod_quiz.timeleft' | translate" [align]="'center'"> | ||||
|             </core-timer> | ||||
|         </ion-title> | ||||
|         <ion-buttons slot="end"> | ||||
| @ -79,10 +79,9 @@ | ||||
|                     </ion-item-divider> | ||||
| 
 | ||||
|                     <!-- Body of the question. --> | ||||
|                     <core-question class="ion-text-wrap" [question]="question" [component]="component" | ||||
|                         [componentId]="cmId" [attemptId]="attempt!.id" [usageId]="attempt!.uniqueid" | ||||
|                         [offlineEnabled]="offline" contextLevel="module" [contextInstanceId]="cmId" | ||||
|                         [courseId]="courseId" [preferredBehaviour]="quiz!.preferredbehaviour" [review]="false" | ||||
|                     <core-question class="ion-text-wrap" [question]="question" [component]="component" [componentId]="cmId" | ||||
|                         [attemptId]="attempt!.id" [usageId]="attempt!.uniqueid" [offlineEnabled]="offline" contextLevel="module" | ||||
|                         [contextInstanceId]="cmId" [courseId]="courseId" [preferredBehaviour]="quiz!.preferredbehaviour" [review]="false" | ||||
|                         (onAbort)="abortQuiz()" (buttonClicked)="behaviourButtonClicked($event)"> | ||||
|                     </core-question> | ||||
|                 </ion-card> | ||||
| @ -92,7 +91,7 @@ | ||||
|         <!-- Go to next or previous page. --> | ||||
|         <ion-grid class="ion-text-wrap" *ngIf="questions.length && !quizAborted && !showSummary"> | ||||
|             <ion-row> | ||||
|                 <ion-col *ngIf="previousPage >= 0" > | ||||
|                 <ion-col *ngIf="previousPage >= 0"> | ||||
|                     <ion-button expand="block" color="light" (click)="changePage(previousPage)"> | ||||
|                         <ion-icon name="fas-chevron-left" slot="start" aria-hidden="true"></ion-icon> | ||||
|                         {{ 'core.previous' | translate }} | ||||
| @ -131,8 +130,8 @@ | ||||
|             <!-- List of questions of the summary table. --> | ||||
|             <ng-container *ngFor="let question of summaryQuestions"> | ||||
|                 <ion-item *ngIf="question.number" (click)="changePage(question.page, false, question.slot)" | ||||
|                     [attr.aria-label]="'core.question.questionno' | translate:{$a: question.number}" | ||||
|                     [detail]="!isSequential && canReturn" [button]="!isSequential && canReturn"> | ||||
|                     [attr.aria-label]="'core.question.questionno' | translate:{$a: question.number}" [detail]="!isSequential && canReturn" | ||||
|                     [button]="!isSequential && canReturn"> | ||||
|                     <ion-label> | ||||
|                         <ion-row class="ion-align-items-center"> | ||||
|                             <ion-col size="3" class="ion-text-center">{{ question.number }}</ion-col> | ||||
| @ -153,8 +152,7 @@ | ||||
|             </ion-item> | ||||
| 
 | ||||
|             <!-- Time left (if quiz is timed). --> | ||||
|             <core-timer *ngIf="endTime" [endTime]="endTime" (finished)="timeUp()" | ||||
|                 [timerText]="'addon.mod_quiz.timeleft' | translate"> | ||||
|             <core-timer *ngIf="endTime" [endTime]="endTime" (finished)="timeUp()" [timerText]="'addon.mod_quiz.timeleft' | translate"> | ||||
|             </core-timer> | ||||
| 
 | ||||
|             <!-- List of messages explaining why the quiz cannot be submitted. --> | ||||
| @ -165,15 +163,14 @@ | ||||
|                 </ion-label> | ||||
|             </ion-item> | ||||
| 
 | ||||
|             <ion-button *ngIf="preventSubmitMessages.length" expand="block" [href]="moduleUrl" core-link | ||||
|                 [showBrowserWarning]="false"> | ||||
|             <ion-button *ngIf="preventSubmitMessages.length" expand="block" [href]="moduleUrl" core-link [showBrowserWarning]="false"> | ||||
|                 {{ 'core.openinbrowser' | translate }} | ||||
|                 <ion-icon name="fas-external-link-alt" slot="end" aria-hidden="true"></ion-icon> | ||||
|             </ion-button> | ||||
| 
 | ||||
|             <!-- Button to submit the quiz. --> | ||||
|             <ion-button *ngIf="!attempt!.finishedOffline && !preventSubmitMessages.length" expand="block" | ||||
|                 class="ion-margin" (click)="finishAttempt(true)"> | ||||
|             <ion-button *ngIf="!attempt!.finishedOffline && !preventSubmitMessages.length" expand="block" class="ion-margin" | ||||
|                 (click)="finishAttempt(true)"> | ||||
|                 {{ 'addon.mod_quiz.submitallandfinish' | translate }} | ||||
|             </ion-button> | ||||
|         </ion-card> | ||||
|  | ||||
| @ -3,7 +3,9 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1>{{ 'addon.mod_quiz.review' | translate }}</h1> | ||||
|         <ion-title> | ||||
|             <h1>{{ 'addon.mod_quiz.review' | translate }}</h1> | ||||
|         </ion-title> | ||||
| 
 | ||||
|         <ion-buttons slot="end"> | ||||
|             <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-label> | ||||
|                         <p class="item-heading">{{ data.title }}</p> | ||||
|                         <core-format-text [component]="component" [componentId]="cmId" [text]="data.content" | ||||
|                             contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId"> | ||||
|                         <core-format-text [component]="component" [componentId]="cmId" [text]="data.content" contextLevel="module" | ||||
|                             [contextInstanceId]="cmId" [courseId]="courseId"> | ||||
|                         </core-format-text> | ||||
|                     </ion-label> | ||||
|                 </ion-item> | ||||
| @ -107,8 +109,7 @@ | ||||
|                     <!-- Body of the question. --> | ||||
|                     <core-question class="ion-text-wrap" [question]="question" [component]="component" [componentId]="cmId" | ||||
|                         [attemptId]="attempt.id" [usageId]="attempt.uniqueid" [offlineEnabled]="false" contextLevel="module" | ||||
|                         [contextInstanceId]="cmId" [courseId]="courseId" [review]="true" | ||||
|                         [preferredBehaviour]="quiz?.preferredbehaviour"> | ||||
|                         [contextInstanceId]="cmId" [courseId]="courseId" [review]="true" [preferredBehaviour]="quiz?.preferredbehaviour"> | ||||
|                     </core-question> | ||||
|                 </ion-card> | ||||
|             </div> | ||||
| @ -130,8 +131,7 @@ | ||||
|                 </ion-button> | ||||
|             </ion-col> | ||||
|             <ion-col class="ion-text-end"> | ||||
|                 <ion-button color="light" *ngIf="nextPage >= -1" (click)="changePage(nextPage)" | ||||
|                     [attr.aria-label]="'core.next' | translate"> | ||||
|                 <ion-button color="light" *ngIf="nextPage >= -1" (click)="changePage(nextPage)" [attr.aria-label]="'core.next' | translate"> | ||||
|                     <ion-icon name="fas-chevron-right" slot="icon-only" aria-hidden="true"></ion-icon> | ||||
|                 </ion-button> | ||||
|             </ion-col> | ||||
|  | ||||
| @ -3,10 +3,12 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1> | ||||
|             <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> | ||||
|             </core-format-text> | ||||
|         </h1> | ||||
|         <ion-title> | ||||
|             <h1> | ||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> | ||||
|                 </core-format-text> | ||||
|             </h1> | ||||
|         </ion-title> | ||||
| 
 | ||||
|         <ion-buttons slot="end"> | ||||
|             <!-- The buttons defined by the component will be added in here. --> | ||||
|  | ||||
| @ -1,6 +1,8 @@ | ||||
| <ion-header> | ||||
|     <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-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate"> | ||||
|                 <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> | ||||
|                     <ion-label> | ||||
|                         <core-format-text [text]="sco.title" contextLevel="module" [contextInstanceId]="moduleId" | ||||
|                             [courseId]="courseId"> | ||||
|                         <core-format-text [text]="sco.title" contextLevel="module" [contextInstanceId]="moduleId" [courseId]="courseId"> | ||||
|                         </core-format-text> | ||||
|                         <span *ngIf="accessInfo && accessInfo.canviewscores && sco.scoreraw"> | ||||
|                             ({{ 'addon.mod_scorm.score' | translate }}: {{sco.scoreraw}}) | ||||
|  | ||||
| @ -3,10 +3,12 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1> | ||||
|             <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> | ||||
|             </core-format-text> | ||||
|         </h1> | ||||
|         <ion-title> | ||||
|             <h1> | ||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> | ||||
|                 </core-format-text> | ||||
|             </h1> | ||||
|         </ion-title> | ||||
|         <ion-buttons slot="end"> | ||||
|             <!-- The buttons defined by the component will be added in here. --> | ||||
|         </ion-buttons> | ||||
|  | ||||
| @ -3,14 +3,16 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1> | ||||
|             <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId"> | ||||
|             </core-format-text> | ||||
|         </h1> | ||||
|         <ion-title> | ||||
|             <h1> | ||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId"> | ||||
|                 </core-format-text> | ||||
|             </h1> | ||||
|         </ion-title> | ||||
|         <ion-buttons slot="end"> | ||||
|             <core-button-with-spinner *ngIf="showToc" [loading]="loadingToc"> | ||||
|                 <ion-button fill="clear" *ngIf="toc.length" (click)="openToc()" | ||||
|                     [attr.aria-label]="'addon.mod_scorm.toc' | translate" aria-haspopup="true"> | ||||
|                 <ion-button fill="clear" *ngIf="toc.length" (click)="openToc()" [attr.aria-label]="'addon.mod_scorm.toc' | translate" | ||||
|                     aria-haspopup="true"> | ||||
|                     <ion-icon name="fas-bookmark" slot="icon-only" aria-hidden="true"></ion-icon> | ||||
|                 </ion-button> | ||||
|             </core-button-with-spinner> | ||||
|  | ||||
| @ -3,9 +3,11 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1> | ||||
|             <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module.id"></core-format-text> | ||||
|         </h1> | ||||
|         <ion-title> | ||||
|             <h1> | ||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module.id"></core-format-text> | ||||
|             </h1> | ||||
|         </ion-title> | ||||
| 
 | ||||
|         <ion-buttons slot="end"> | ||||
|             <!-- The buttons defined by the component will be added in here. --> | ||||
|  | ||||
| @ -3,9 +3,11 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1> | ||||
|             <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id"></core-format-text> | ||||
|         </h1> | ||||
|         <ion-title> | ||||
|             <h1> | ||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id"></core-format-text> | ||||
|             </h1> | ||||
|         </ion-title> | ||||
| 
 | ||||
|         <ion-buttons slot="end"> | ||||
|             <!-- The buttons defined by the component will be added in here. --> | ||||
|  | ||||
| @ -50,13 +50,13 @@ | ||||
|     <!-- Activity info. --> | ||||
|     <core-course-module-info [module]="module" (completionChanged)="onCompletionChange()" [description]="description" | ||||
|         [component]="component" [componentId]="componentId" [courseId]="courseId"> | ||||
|         <h3 *ngIf="pageTitle" title>{{pageTitle}}</h3> | ||||
|         <h2 *ngIf="pageTitle" title>{{pageTitle}}</h2> | ||||
|     </core-course-module-info> | ||||
| 
 | ||||
|     <div *ngIf="pageIsOffline || hasOffline || pageWarning"> | ||||
|         <!-- Wiki has something offline. --> | ||||
|         <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-label> | ||||
|                     <span *ngIf="pageIsOffline">{{ 'core.hasdatatosync' | translate:{$a: pageStr} }}</span> | ||||
|  | ||||
| @ -1,6 +1,8 @@ | ||||
| <ion-header> | ||||
|     <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-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate"> | ||||
|                 <ion-icon slot="icon-only" name="fas-times" aria-hidden="true"></ion-icon> | ||||
| @ -18,14 +20,15 @@ | ||||
|             </ion-item> | ||||
|             <ng-container *ngFor="let letter of map"> | ||||
|                 <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 class="ion-text-wrap" *ngFor="let page of letter.pages" (click)="goToPage(page)" | ||||
|                     [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-label> | ||||
|                         <core-format-text [text]="page.title" contextLevel="module" [contextInstanceId]="moduleId" | ||||
|                             [courseId]="courseId"> | ||||
|                         <core-format-text [text]="page.title" contextLevel="module" [contextInstanceId]="moduleId" [courseId]="courseId"> | ||||
|                         </core-format-text> | ||||
|                     </ion-label> | ||||
|                     <ion-note *ngIf="!page.id" slot="end"> | ||||
|  | ||||
| @ -3,10 +3,12 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1> | ||||
|             <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId"> | ||||
|             </core-format-text> | ||||
|         </h1> | ||||
|         <ion-title> | ||||
|             <h1> | ||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId"> | ||||
|                 </core-format-text> | ||||
|             </h1> | ||||
|         </ion-title> | ||||
| 
 | ||||
|         <ion-buttons slot="end"> | ||||
|             <ion-button fill="clear" (click)="save()"> | ||||
| @ -20,20 +22,19 @@ | ||||
|         <form [formGroup]="pageForm" #editPageForm *ngIf="loaded"> | ||||
|             <ion-item class="ion-text-wrap" *ngIf="canEditTitle"> | ||||
|                 <ion-label class="sr-only">{{ 'addon.mod_wiki.newpagetitle' | translate }}</ion-label> | ||||
|                 <ion-input name="title" type="text" [placeholder]="'addon.mod_wiki.newpagetitle' | translate" | ||||
|                     formControlName="title"> | ||||
|                 <ion-input name="title" type="text" [placeholder]="'addon.mod_wiki.newpagetitle' | translate" formControlName="title"> | ||||
|                 </ion-input> | ||||
|             </ion-item> | ||||
| 
 | ||||
|             <ion-item> | ||||
|                 <ion-label class="sr-only">{{ 'core.content' | translate }}</ion-label> | ||||
|                 <core-rich-text-editor [control]="contentControl" [placeholder]="'core.content' | translate" | ||||
|                     name="wiki_page_content" [component]="component" [componentId]="cmId" [autoSave]="true" contextLevel="module" | ||||
|                     [contextInstanceId]="cmId" elementId="newcontent_editor" [draftExtraParams]="editorExtraParams"> | ||||
|                 <core-rich-text-editor [control]="contentControl" [placeholder]="'core.content' | translate" name="wiki_page_content" | ||||
|                     [component]="component" [componentId]="cmId" [autoSave]="true" contextLevel="module" [contextInstanceId]="cmId" | ||||
|                     elementId="newcontent_editor" [draftExtraParams]="editorExtraParams"> | ||||
|                 </core-rich-text-editor> | ||||
|             </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-badge color="danger" class="ion-padding">{{ 'addon.mod_wiki.wrongversionlock' | translate }}</ion-badge> | ||||
|                 </ion-label> | ||||
|  | ||||
| @ -3,14 +3,16 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1> | ||||
|             <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> | ||||
|             </core-format-text> | ||||
|         </h1> | ||||
|         <p> | ||||
|             <core-format-text [text]="pageTitle" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> | ||||
|             </core-format-text> | ||||
|         </p> | ||||
|         <ion-title> | ||||
|             <h1> | ||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> | ||||
|                 </core-format-text> | ||||
|             </h1> | ||||
|             <h2> | ||||
|                 <core-format-text [text]="pageTitle" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId"> | ||||
|                 </core-format-text> | ||||
|             </h2> | ||||
|         </ion-title> | ||||
| 
 | ||||
|         <ion-buttons slot="end"> | ||||
|             <!-- The buttons defined by the component will be added in here. --> | ||||
|  | ||||
| @ -1,9 +1,8 @@ | ||||
| <ion-header> | ||||
|     <ion-toolbar> | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h2>{{ 'addon.mod_workshop.userplan' | translate }}</h2> | ||||
|         <ion-title> | ||||
|             <h2>{{ 'addon.mod_workshop.userplan' | translate }}</h2> | ||||
|         </ion-title> | ||||
|         <ion-buttons slot="end"> | ||||
|             <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> | ||||
| @ -30,8 +29,8 @@ | ||||
|                 <ion-icon slot="end" name="fas-external-link-alt" aria-hidden="true"></ion-icon> | ||||
|             </ion-item> | ||||
|             <ion-item class="ion-text-wrap" *ngFor="let task of phase.tasks" | ||||
|                 [class.item-dimmed]="phase.code != workshopPhase || (task.code == 'submit' && !showSubmit)" | ||||
|                 (click)="runTask(task)" detail="false" button> | ||||
|                 [class.item-dimmed]="phase.code != workshopPhase || (task.code == 'submit' && !showSubmit)" (click)="runTask(task)" | ||||
|                 detail="false" button> | ||||
|                 <ion-icon slot="start" name="far-circle" *ngIf="task.completed == null" | ||||
|                     [attr.aria-label]="'addon.mod_workshop.tasktodo' | translate"></ion-icon> | ||||
|                 <ion-icon slot="start" name="fas-times-circle" color="danger" *ngIf="task.completed == ''" | ||||
|  | ||||
| @ -3,11 +3,13 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1> | ||||
|             <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="workshop && workshop.coursemodule" | ||||
|                 [courseId]="courseId"> | ||||
|             </core-format-text> | ||||
|         </h1> | ||||
|         <ion-title> | ||||
|             <h1> | ||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="workshop && workshop.coursemodule" | ||||
|                     [courseId]="courseId"> | ||||
|                 </core-format-text> | ||||
|             </h1> | ||||
|         </ion-title> | ||||
|         <ion-buttons slot="end" [hidden]="!evaluating"> | ||||
|             <ion-button fill="clear" (click)="saveEvaluation()"> | ||||
|                 {{ 'core.save' | translate }} | ||||
| @ -48,14 +50,15 @@ | ||||
|             </ion-label> | ||||
|         </ion-item> | ||||
| 
 | ||||
|         <addon-mod-workshop-assessment-strategy | ||||
|             *ngIf="assessment && assessmentId && showGrade(assessment.grade) && workshop && access" [workshop]="workshop" | ||||
|             [access]="access" [assessmentId]="assessmentId" [userId]="profile && profile.id" [strategy]="strategy"> | ||||
|         <addon-mod-workshop-assessment-strategy *ngIf="assessment && assessmentId && showGrade(assessment.grade) && workshop && access" | ||||
|             [workshop]="workshop" [access]="access" [assessmentId]="assessmentId" [userId]="profile && profile.id" [strategy]="strategy"> | ||||
|         </addon-mod-workshop-assessment-strategy> | ||||
| 
 | ||||
|         <form [formGroup]="evaluateForm" *ngIf="evaluating" #evaluateFormEl> | ||||
|             <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 class="ion-text-wrap" *ngIf="access?.canallocate"> | ||||
|                 <ion-label position="stacked"> | ||||
| @ -85,16 +88,16 @@ | ||||
|             </ion-item> | ||||
|             <ion-item *ngIf="access?.canoverridegrades"> | ||||
|                 <ion-label position="stacked">{{ 'addon.mod_workshop.feedbackreviewer' | translate }}</ion-label> | ||||
|                 <core-rich-text-editor [control]="evaluateForm.controls['text']" name="text" | ||||
|                     [autoSave]="true" contextLevel="module" [contextInstanceId]="workshop?.coursemodule" | ||||
|                     elementId="feedbackreviewer_editor" [draftExtraParams]="{asid: assessmentId}"> | ||||
|                 <core-rich-text-editor [control]="evaluateForm.controls['text']" name="text" [autoSave]="true" contextLevel="module" | ||||
|                     [contextInstanceId]="workshop?.coursemodule" elementId="feedbackreviewer_editor" | ||||
|                     [draftExtraParams]="{asid: assessmentId}"> | ||||
|                 </core-rich-text-editor> | ||||
|             </ion-item> | ||||
|         </form> | ||||
|         <ion-list *ngIf="!evaluating && evaluate && evaluate.text"> | ||||
|             <ion-item class="ion-text-wrap"> | ||||
|                 <core-user-avatar *ngIf="evaluateByProfile" [user]="evaluateByProfile" slot="start" | ||||
|                     [courseId]="courseId" [userId]="evaluateByProfile.id"></core-user-avatar> | ||||
|                 <core-user-avatar *ngIf="evaluateByProfile" [user]="evaluateByProfile" slot="start" [courseId]="courseId" | ||||
|                     [userId]="evaluateByProfile.id"></core-user-avatar> | ||||
|                 <ion-label> | ||||
|                     <h2 *ngIf="evaluateByProfile && evaluateByProfile.fullname"> | ||||
|                         {{ 'addon.mod_workshop.feedbackby' | translate : {$a: evaluateByProfile.fullname} }} | ||||
|  | ||||
| @ -3,7 +3,9 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1>{{ 'addon.mod_workshop.editsubmission' | translate }}</h1> | ||||
|         <ion-title> | ||||
|             <h1>{{ 'addon.mod_workshop.editsubmission' | translate }}</h1> | ||||
|         </ion-title> | ||||
|         <ion-buttons slot="end"> | ||||
|             <ion-button fill="clear" (click)="save()" [attr.aria-label]="'core.save' | translate"> | ||||
|                 {{ 'core.save' | translate }} | ||||
| @ -38,9 +40,8 @@ | ||||
|             </ion-item> | ||||
| 
 | ||||
|             <core-attachments *ngIf="fileAvailable" [files]="attachments" [maxSize]="workshop.maxbytes" | ||||
|                 [maxSubmissions]="workshop.nattachments" [component]="component" [componentId]="workshop.coursemodule" | ||||
|                 allowOffline="true" [acceptedTypes]="workshop.submissionfiletypes" [required]="fileRequired" | ||||
|                 [courseId]="workshop.course"> | ||||
|                 [maxSubmissions]="workshop.nattachments" [component]="component" [componentId]="workshop.coursemodule" allowOffline="true" | ||||
|                 [acceptedTypes]="workshop.submissionfiletypes" [required]="fileRequired" [courseId]="workshop.course"> | ||||
|             </core-attachments> | ||||
|         </form> | ||||
|     </core-loading> | ||||
|  | ||||
| @ -3,10 +3,12 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1> | ||||
|             <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId"> | ||||
|             </core-format-text> | ||||
|         </h1> | ||||
|         <ion-title> | ||||
|             <h1> | ||||
|                 <core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId"> | ||||
|                 </core-format-text> | ||||
|             </h1> | ||||
|         </ion-title> | ||||
|         <ion-buttons slot="end"> | ||||
|             <!-- The buttons defined by the component will be added in here. --> | ||||
|         </ion-buttons> | ||||
|  | ||||
| @ -3,10 +3,12 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1> | ||||
|             <core-format-text *ngIf="title" [text]="title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId"> | ||||
|             </core-format-text> | ||||
|         </h1> | ||||
|         <ion-title> | ||||
|             <h1> | ||||
|                 <core-format-text *ngIf="title" [text]="title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId"> | ||||
|                 </core-format-text> | ||||
|             </h1> | ||||
|         </ion-title> | ||||
|         <ion-buttons slot="end" [hidden]="!loaded"> | ||||
|             <ion-button *ngIf="assessmentId && access.assessingallowed" fill="clear" (click)="saveAssessment()" | ||||
|                 [attr.aria-label]="'core.save' | translate"> | ||||
| @ -55,8 +57,7 @@ | ||||
|                     <h2 *ngIf="evaluateByProfile && evaluateByProfile.fullname"> | ||||
|                         {{ 'addon.mod_workshop.feedbackby' | translate : {$a: evaluateByProfile.fullname} }} | ||||
|                     </h2> | ||||
|                     <core-format-text [text]="evaluate?.text" contextLevel="module" [contextInstanceId]="module.id" | ||||
|                         [courseId]="courseId"> | ||||
|                     <core-format-text [text]="evaluate?.text" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId"> | ||||
|                     </core-format-text> | ||||
|                 </ion-label> | ||||
|             </ion-item> | ||||
| @ -68,8 +69,8 @@ | ||||
|                     <h2>{{ 'addon.mod_workshop.yourassessment' | translate }}</h2> | ||||
|                 </ion-label> | ||||
|             </ion-item> | ||||
|             <addon-mod-workshop-assessment [submission]="submission" [assessment]="ownAssessment" [courseId]="courseId" | ||||
|                 [access]="access" [module]="module" [workshop]="workshop"> | ||||
|             <addon-mod-workshop-assessment [submission]="submission" [assessment]="ownAssessment" [courseId]="courseId" [access]="access" | ||||
|                 [module]="module" [workshop]="workshop"> | ||||
|             </addon-mod-workshop-assessment> | ||||
|         </ion-list> | ||||
| 
 | ||||
| @ -92,8 +93,8 @@ | ||||
|                     <h2>{{ 'addon.mod_workshop.givengrades' | translate }}</h2> | ||||
|                 </ion-label> | ||||
|             </ion-item> | ||||
|             <addon-mod-workshop-assessment *ngFor="let reviewer of submissionInfo.reviewerof" [assessment]="reviewer" | ||||
|                 [courseId]="courseId" [module]="module" [workshop]="workshop" [access]="access"> | ||||
|             <addon-mod-workshop-assessment *ngFor="let reviewer of submissionInfo.reviewerof" [assessment]="reviewer" [courseId]="courseId" | ||||
|                 [module]="module" [workshop]="workshop" [access]="access"> | ||||
|             </addon-mod-workshop-assessment> | ||||
|         </ion-list> | ||||
| 
 | ||||
| @ -126,21 +127,20 @@ | ||||
|             </ion-item> | ||||
|             <ion-item> | ||||
|                 <ion-label position="stacked">{{ 'addon.mod_workshop.feedbackauthor' | translate }}</ion-label> | ||||
|                 <core-rich-text-editor [control]="feedbackForm.controls['text']" name="text" | ||||
|                     [autoSave]="true" contextLevel="module" [contextInstanceId]="module.id" elementId="feedbackauthor_editor" | ||||
|                     [draftExtraParams]="{id: submissionId}"> | ||||
|                 <core-rich-text-editor [control]="feedbackForm.controls['text']" name="text" [autoSave]="true" contextLevel="module" | ||||
|                     [contextInstanceId]="module.id" elementId="feedbackauthor_editor" [draftExtraParams]="{id: submissionId}"> | ||||
|                 </core-rich-text-editor> | ||||
|             </ion-item> | ||||
|         </form> | ||||
| 
 | ||||
|         <addon-mod-workshop-assessment-strategy *ngIf="assessmentId" [workshop]="workshop" [access]="access" | ||||
|             [assessmentId]="assessmentId" [userId]="assessmentUserId" [strategy]="strategy" [edit]="access.assessingallowed"> | ||||
|         <addon-mod-workshop-assessment-strategy *ngIf="assessmentId" [workshop]="workshop" [access]="access" [assessmentId]="assessmentId" | ||||
|             [userId]="assessmentUserId" [strategy]="strategy" [edit]="access.assessingallowed"> | ||||
|         </addon-mod-workshop-assessment-strategy> | ||||
| 
 | ||||
|         <ion-list *ngIf="assessmentId && !access.assessingallowed && assessment?.feedbackreviewer"> | ||||
|             <ion-item class="ion-text-wrap"> | ||||
|                 <core-user-avatar *ngIf="evaluateGradingByProfile" [user]="evaluateGradingByProfile" slot="start" | ||||
|                     [courseId]="courseId" [userId]="evaluateGradingByProfile.id"></core-user-avatar> | ||||
|                 <core-user-avatar *ngIf="evaluateGradingByProfile" [user]="evaluateGradingByProfile" slot="start" [courseId]="courseId" | ||||
|                     [userId]="evaluateGradingByProfile.id"></core-user-avatar> | ||||
|                 <ion-label> | ||||
|                     <h2 *ngIf="evaluateGradingByProfile && evaluateGradingByProfile.fullname"> | ||||
|                         {{ 'addon.mod_workshop.feedbackby' | translate : {$a: evaluateGradingByProfile.fullname} }} | ||||
|  | ||||
| @ -1,6 +1,8 @@ | ||||
| <ion-header> | ||||
|     <ion-toolbar> | ||||
|         <h2>{{ 'addon.notes.addnewnote' | translate }}</h2> | ||||
|         <ion-title> | ||||
|             <h2>{{ 'addon.notes.addnewnote' | translate }}</h2> | ||||
|         </ion-title> | ||||
|         <ion-buttons slot="end"> | ||||
|             <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> | ||||
| @ -20,8 +22,7 @@ | ||||
|         </ion-item> | ||||
|         <ion-item> | ||||
|             <ion-label class="sr-only">{{ 'addon.notes.note' | translate }}</ion-label> | ||||
|             <ion-textarea placeholder="{{ 'addon.notes.note' | translate }}" rows="5" [(ngModel)]="text" name="text" | ||||
|                 required="required"> | ||||
|             <ion-textarea placeholder="{{ 'addon.notes.note' | translate }}" rows="5" [(ngModel)]="text" name="text" required="required"> | ||||
|             </ion-textarea> | ||||
|         </ion-item> | ||||
|         <div class="ion-padding"> | ||||
|  | ||||
| @ -4,7 +4,9 @@ | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
| 
 | ||||
|         <h1>{{ 'addon.notes.notes' | translate }}</h1> | ||||
|         <ion-title> | ||||
|             <h1>{{ 'addon.notes.notes' | translate }}</h1> | ||||
|         </ion-title> | ||||
|         <ion-buttons slot="end"> | ||||
|         </ion-buttons> | ||||
|     </ion-toolbar> | ||||
| @ -15,13 +17,12 @@ | ||||
|         <ion-icon name="fas-pen" slot="icon-only" aria-hidden="true"></ion-icon> | ||||
|     </ion-button> | ||||
|     <core-context-menu> | ||||
|         <core-context-menu-item [hidden]="!(notesLoaded && !hasOffline)" [priority]="100" | ||||
|             [content]="'core.refresh' | translate" (action)="refreshNotes(false)" | ||||
|             [iconAction]="refreshIcon" [closeOnClick]="true"> | ||||
|         <core-context-menu-item [hidden]="!(notesLoaded && !hasOffline)" [priority]="100" [content]="'core.refresh' | translate" | ||||
|             (action)="refreshNotes(false)" [iconAction]="refreshIcon" [closeOnClick]="true"> | ||||
|         </core-context-menu-item> | ||||
|         <core-context-menu-item [hidden]="!(notesLoaded && hasOffline)" [priority]="100" | ||||
|             [content]="'core.settings.synchronizenow' | translate" (action)="refreshNotes(true)" | ||||
|             [iconAction]="syncIcon" [closeOnClick]="false"></core-context-menu-item> | ||||
|             [content]="'core.settings.synchronizenow' | translate" (action)="refreshNotes(true)" [iconAction]="syncIcon" | ||||
|             [closeOnClick]="false"></core-context-menu-item> | ||||
|     </core-context-menu> | ||||
| </core-navbar-buttons> | ||||
| <ion-content> | ||||
| @ -32,7 +33,9 @@ | ||||
|     <core-loading [hideUntil]="notesLoaded"> | ||||
|         <ion-item class="ion-text-wrap" *ngIf="user"> | ||||
|             <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> | ||||
| 
 | ||||
|         <core-combobox [selection]="type" (onChange)="typeChanged($event)"> | ||||
| @ -83,14 +86,16 @@ | ||||
|                         [attr.aria-label]="'core.restore' | translate"> | ||||
|                         <ion-icon name="fas-undo-alt" slot="icon-only" aria-hidden="true"></ion-icon> | ||||
|                     </ion-button> | ||||
|                     <ion-button *ngIf="showDelete && !note.deleted && (type != 'personal' || note.usermodified == currentUserId)" | ||||
|                         slot="end" fill="clear" [@coreSlideInOut]="'fromRight'" color="danger" (click)="deleteNote($event, note)" | ||||
|                     <ion-button *ngIf="showDelete && !note.deleted && (type != 'personal' || note.usermodified == currentUserId)" slot="end" | ||||
|                         fill="clear" [@coreSlideInOut]="'fromRight'" color="danger" (click)="deleteNote($event, note)" | ||||
|                         [attr.aria-label]="'core.delete' | translate"> | ||||
|                         <ion-icon name="fas-trash" slot="icon-only" aria-hidden="true"></ion-icon> | ||||
|                     </ion-button> | ||||
|                 </ion-item> | ||||
|                 <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-card> | ||||
|         </ng-container> | ||||
|  | ||||
| @ -3,7 +3,9 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1>{{ 'addon.notifications.notifications' | translate }}</h1> | ||||
|         <ion-title> | ||||
|             <h1>{{ 'addon.notifications.notifications' | translate }}</h1> | ||||
|         </ion-title> | ||||
|         <ion-buttons slot="end"> | ||||
|             <core-user-menu-button></core-user-menu-button> | ||||
|         </ion-buttons> | ||||
| @ -15,8 +17,7 @@ | ||||
|     </ion-refresher> | ||||
|     <core-loading [hideUntil]="notificationsLoaded"> | ||||
|         <div class="ion-padding" *ngIf="canMarkAllNotificationsAsRead"> | ||||
|             <ion-button [disabled]="loadingMarkAllNotificationsAsRead" expand="block" (click)="markAllNotificationsAsRead()" | ||||
|                 color="light"> | ||||
|             <ion-button [disabled]="loadingMarkAllNotificationsAsRead" expand="block" (click)="markAllNotificationsAsRead()" color="light"> | ||||
|                 <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> | ||||
| @ -25,8 +26,7 @@ | ||||
|         </div> | ||||
| 
 | ||||
|         <ion-card *ngFor="let notification of notifications"> | ||||
|             <ion-item class="ion-text-wrap" lines="none" | ||||
|                 [attr.aria-label]=" | ||||
|             <ion-item class="ion-text-wrap" lines="none" [attr.aria-label]=" | ||||
|                     notification.timeread | ||||
|                     ? notification.subject | ||||
|                     : 'addon.notifications.unreadnotification' | translate: {$a: notification.subject}"> | ||||
| @ -34,8 +34,8 @@ | ||||
|                     [profileUrl]="notification.profileimageurlfrom" [fullname]="notification.userfromfullname" | ||||
|                     [userId]="notification.useridfrom" [extraIcon]="notification.iconurl"></core-user-avatar> | ||||
| 
 | ||||
|                 <img *ngIf="notification.useridfrom <= 0 && notification.iconurl" [src]="notification.iconurl" alt="" | ||||
|                     role="presentation" class="core-notification-icon" slot="start"> | ||||
|                 <img *ngIf="notification.useridfrom <= 0 && notification.iconurl" [src]="notification.iconurl" alt="" role="presentation" | ||||
|                     class="core-notification-icon" slot="start"> | ||||
| 
 | ||||
|                 <ion-label> | ||||
|                     <p class="item-heading">{{ notification.subject }}</p> | ||||
| @ -50,8 +50,8 @@ | ||||
|             </ion-item> | ||||
|             <ion-item class="ion-text-wrap"> | ||||
|                 <ion-label> | ||||
|                     <core-format-text [text]="notification.mobiletext | coreCreateLinks" contextLevel="system" | ||||
|                     [contextInstanceId]="0" [maxHeight]="120"> | ||||
|                     <core-format-text [text]="notification.mobiletext | coreCreateLinks" contextLevel="system" [contextInstanceId]="0" | ||||
|                         [maxHeight]="120"> | ||||
|                     </core-format-text> | ||||
|                 </ion-label> | ||||
|             </ion-item> | ||||
|  | ||||
| @ -3,7 +3,9 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h2>{{ 'addon.notifications.notifications' | translate }}</h2> | ||||
|         <ion-title> | ||||
|             <h2>{{ 'addon.notifications.notifications' | translate }}</h2> | ||||
|         </ion-title> | ||||
|     </ion-toolbar> | ||||
| </ion-header> | ||||
| <ion-content> | ||||
| @ -12,8 +14,7 @@ | ||||
|             <core-user-avatar *ngIf="userIdFrom > 0" slot="start" [userId]="userIdFrom" [profileUrl]="profileImageUrlFrom" | ||||
|                 [fullname]="userFromFullName" [extraIcon]="iconUrl"></core-user-avatar> | ||||
| 
 | ||||
|             <img *ngIf="userIdFrom <= 0 && iconUrl" [src]="iconUrl" alt="" | ||||
|                 role="presentation" class="core-notification-icon" slot="start"> | ||||
|             <img *ngIf="userIdFrom <= 0 && iconUrl" [src]="iconUrl" alt="" role="presentation" class="core-notification-icon" slot="start"> | ||||
| 
 | ||||
|             <ion-label> | ||||
|                 <p class="item-heading">{{ subject }}</p> | ||||
|  | ||||
| @ -3,7 +3,9 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1>{{ 'addon.notifications.notifications' | translate }}</h1> | ||||
|         <ion-title> | ||||
|             <h1>{{ 'addon.notifications.notifications' | translate }}</h1> | ||||
|         </ion-title> | ||||
|         <ion-buttons slot="end"> | ||||
|         </ion-buttons> | ||||
|     </ion-toolbar> | ||||
| @ -65,8 +67,7 @@ | ||||
|                                 !(notification.processorsByName[currentProcessor!.name][state] && | ||||
|                                 notification.processorsByName[currentProcessor!.name][state].updating)"> | ||||
|                             </ion-spinner> | ||||
|                             <ion-toggle | ||||
|                                 *ngIf="preferences!.enableall && !notification.processorsByName[currentProcessor!.name].locked" | ||||
|                             <ion-toggle *ngIf="preferences!.enableall && !notification.processorsByName[currentProcessor!.name].locked" | ||||
|                                 [(ngModel)]="notification.processorsByName[currentProcessor!.name][state].checked" | ||||
|                                 (ngModelChange)="changePreference(notification, state)" | ||||
|                                 [disabled]="notification.processorsByName[currentProcessor!.name][state].updating"> | ||||
| @ -88,18 +89,15 @@ | ||||
|                 <!-- 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-label>{{ 'core.settings.' + state | translate }}</ion-label> | ||||
|                     <ion-spinner slot="end" | ||||
|                         *ngIf="preferences!.enableall && (notification.processorsByName[currentProcessor!.name][state] && | ||||
|                     <ion-spinner slot="end" *ngIf="preferences!.enableall && (notification.processorsByName[currentProcessor!.name][state] && | ||||
|                         notification.processorsByName[currentProcessor!.name][state].updating)"> | ||||
|                     </ion-spinner> | ||||
|                     <ion-toggle slot="end" | ||||
|                         *ngIf="preferences!.enableall && !notification.processorsByName[currentProcessor!.name].locked" | ||||
|                     <ion-toggle slot="end" *ngIf="preferences!.enableall && !notification.processorsByName[currentProcessor!.name].locked" | ||||
|                         [(ngModel)]="notification.processorsByName[currentProcessor!.name][state].checked" | ||||
|                         (ngModelChange)="changePreference(notification, state)" | ||||
|                         [disabled]="notification.processorsByName[currentProcessor!.name][state].updating"> | ||||
|                     </ion-toggle> | ||||
|                     <span slot="end" | ||||
|                         *ngIf="preferences!.enableall && notification.processorsByName[currentProcessor!.name].locked" | ||||
|                     <span slot="end" *ngIf="preferences!.enableall && notification.processorsByName[currentProcessor!.name].locked" | ||||
|                         class="text-gray"> | ||||
|                         {{'core.settings.locked' | translate }} | ||||
|                     </span> | ||||
|  | ||||
| @ -3,7 +3,9 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1>{{ title }}</h1> | ||||
|         <ion-title> | ||||
|             <h1>{{ title }}</h1> | ||||
|         </ion-title> | ||||
|     </ion-toolbar> | ||||
| </ion-header> | ||||
| <ion-content> | ||||
| @ -25,9 +27,11 @@ | ||||
| 
 | ||||
|         <!-- Display info about space used and space left. --> | ||||
|         <ion-card class="core-info-card" *ngIf="userQuota && filesInfo && filesInfo.filecount > 0"> | ||||
|             <ion-item><ion-label> | ||||
|             {{ 'core.quotausage' | translate:{$a: {used: spaceUsed, total: userQuotaReadable} } }} | ||||
|             </ion-label></ion-item> | ||||
|             <ion-item> | ||||
|                 <ion-label> | ||||
|                     {{ 'core.quotausage' | translate:{$a: {used: spaceUsed, total: userQuotaReadable} } }} | ||||
|                 </ion-label> | ||||
|             </ion-item> | ||||
|         </ion-card> | ||||
| 
 | ||||
|         <!-- List of files. --> | ||||
|  | ||||
| @ -3,7 +3,9 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1>{{ 'addon.storagemanager.managestorage' | translate }}</h1> | ||||
|         <ion-title> | ||||
|             <h1>{{ 'addon.storagemanager.managestorage' | translate }}</h1> | ||||
|         </ion-title> | ||||
|     </ion-toolbar> | ||||
| </ion-header> | ||||
| <ion-content> | ||||
| @ -20,8 +22,7 @@ | ||||
|                     </ion-label> | ||||
|                     <p slot="end" class="ion-text-end">{{ totalSize | coreBytesToSize }}</p> | ||||
|                     <ion-button slot="end" (click)="deleteForCourse()" [disabled]="totalSize == 0"> | ||||
|                         <ion-icon name="fas-trash" slot="icon-only" | ||||
|                             [attr.aria-label]="'addon.storagemanager.deletecourse' | translate"> | ||||
|                         <ion-icon name="fas-trash" slot="icon-only" [attr.aria-label]="'addon.storagemanager.deletecourse' | translate"> | ||||
|                         </ion-icon> | ||||
|                     </ion-button> | ||||
|                 </ion-item> | ||||
| @ -45,8 +46,8 @@ | ||||
|                 <ion-card-content> | ||||
|                     <ng-container *ngFor="let module of section.modules"> | ||||
|                         <ion-item class="ion-no-padding" *ngIf="module.totalSize! > 0"> | ||||
|                             <core-mod-icon slot="start" *ngIf="module.handlerData!.icon" | ||||
|                                 [modicon]="module.handlerData!.icon" [modname]="module.modname" [componentId]="module.instance"> | ||||
|                             <core-mod-icon slot="start" *ngIf="module.handlerData!.icon" [modicon]="module.handlerData!.icon" | ||||
|                                 [modname]="module.modname" [componentId]="module.instance"> | ||||
|                             </core-mod-icon> | ||||
|                             <ion-label class="ion-text-wrap"> | ||||
|                                 <h3 class="{{module.handlerData!.class}} addon-storagemanager-module-size"> | ||||
|  | ||||
| @ -3,7 +3,9 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1>{{ 'addon.storagemanager.managestorage' | translate }}</h1> | ||||
|         <ion-title> | ||||
|             <h1>{{ 'addon.storagemanager.managestorage' | translate }}</h1> | ||||
|         </ion-title> | ||||
|     </ion-toolbar> | ||||
| </ion-header> | ||||
| <ion-content> | ||||
| @ -14,12 +16,13 @@ | ||||
|                 <p class="ion-text-wrap">{{ 'addon.storagemanager.info' | translate }}</p> | ||||
|                 <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-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> | ||||
|                     <ion-button slot="end" (click)="deleteCompletelyDownloadedCourses()" | ||||
|                         [disabled]="completelyDownloadedCourses.length === 0"> | ||||
|                         <ion-icon name="fas-trash" slot="icon-only" | ||||
|                             ariaLabel="{{ 'addon.storagemanager.deletecourses' | translate }}"> | ||||
|                         <ion-icon name="fas-trash" slot="icon-only" ariaLabel="{{ 'addon.storagemanager.deletecourses' | translate }}"> | ||||
|                         </ion-icon> | ||||
|                     </ion-button> | ||||
|                 </ion-item> | ||||
|  | ||||
| @ -1,6 +1,8 @@ | ||||
| <ion-header> | ||||
|     <ion-toolbar> | ||||
|         <h1>{{ 'core.block.blocks' | translate }}</h1> | ||||
|         <ion-title> | ||||
|             <h2>{{ 'core.block.blocks' | translate }}</h2> | ||||
|         </ion-title> | ||||
|         <ion-buttons slot="end"> | ||||
|             <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> | ||||
|  | ||||
| @ -3,19 +3,20 @@ | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h1> | ||||
|             <core-format-text [text]="title" [contextLevel]="contextLevel" [contextInstanceId]="instanceId" [courseId]="courseId"> | ||||
|             </core-format-text> | ||||
|         </h1> | ||||
|         <ion-title> | ||||
|             <h1> | ||||
|                 <core-format-text [text]="title" [contextLevel]="contextLevel" [contextInstanceId]="instanceId" [courseId]="courseId"> | ||||
|                 </core-format-text> | ||||
|             </h1> | ||||
|         </ion-title> | ||||
|         <ion-buttons slot="end"> | ||||
|             <ion-button *ngIf="canDeleteComments" slot="end" fill="clear" (click)="toggleDelete()" | ||||
|                 [attr.aria-label]="'core.toggledelete' | translate"> | ||||
|                 <ion-icon name="fas-pen" slot="icon-only" aria-hidden="true"></ion-icon> | ||||
|             </ion-button> | ||||
|             <core-context-menu> | ||||
|                 <core-context-menu-item [hidden]="!(commentsLoaded && !hasOffline)" [priority]="100" | ||||
|                     [content]="'core.refresh' | translate" (action)="refreshComments(false)" [iconAction]="refreshIcon" | ||||
|                     [closeOnClick]="true"> | ||||
|                 <core-context-menu-item [hidden]="!(commentsLoaded && !hasOffline)" [priority]="100" [content]="'core.refresh' | translate" | ||||
|                     (action)="refreshComments(false)" [iconAction]="refreshIcon" [closeOnClick]="true"> | ||||
|                 </core-context-menu-item> | ||||
|                 <core-context-menu-item [hidden]="!(commentsLoaded && hasOffline)" [priority]="100" | ||||
|                     [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> | ||||
|     <core-loading [hideUntil]="commentsLoaded"> | ||||
|         <core-empty-box *ngIf="!comments || !comments.length" icon="fas-comments" | ||||
|             [message]="'core.comments.nocomments' | translate"> | ||||
|         <core-empty-box *ngIf="!comments || !comments.length" icon="fas-comments" [message]="'core.comments.nocomments' | translate"> | ||||
|         </core-empty-box> | ||||
| 
 | ||||
|         <!-- Load previous messages. --> | ||||
| @ -45,10 +45,8 @@ | ||||
|                     {{ comment.timecreated * 1000 | coreFormatDate: "strftimedayshort" }} | ||||
|                 </p> | ||||
| 
 | ||||
|                 <ion-item class="ion-text-wrap addon-message" | ||||
|                     [class.addon-message-mine]="comment.userid == currentUserId" | ||||
|                     [class.addon-message-not-mine]="comment.userid != currentUserId" | ||||
|                     [class.addon-message-no-user]="!comment.showUserData" | ||||
|                 <ion-item class="ion-text-wrap addon-message" [class.addon-message-mine]="comment.userid == currentUserId" | ||||
|                     [class.addon-message-not-mine]="comment.userid != currentUserId" [class.addon-message-no-user]="!comment.showUserData" | ||||
|                     [@coreSlideInOut]="comment.userid == currentUserId ? '' : 'fromLeft'"> | ||||
|                     <ion-label> | ||||
|                         <!-- User data. --> | ||||
| @ -88,10 +86,7 @@ | ||||
|                 </ion-item> | ||||
|             </ng-container> | ||||
| 
 | ||||
|             <ion-item | ||||
|                 *ngIf="offlineComment" | ||||
|                 class="ion-text-wrap addon-message addon-message-mine" | ||||
|             > | ||||
|             <ion-item *ngIf="offlineComment" class="ion-text-wrap addon-message addon-message-mine"> | ||||
|                 <ion-label> | ||||
|                     <!-- User data. --> | ||||
|                     <p class="ion-text-center"> | ||||
| @ -109,9 +104,9 @@ | ||||
|                     <ion-icon name="fas-clock" aria-hidden="true"></ion-icon> {{ 'core.notsent' | translate }} | ||||
|                 </ion-note> | ||||
|                 <div class="tail"></div> | ||||
|                 <ion-button *ngIf="showDelete" slot="end" fill="clear" | ||||
|                     [@coreSlideInOut]="'fromRight'" color="danger" (click)="deleteComment($event, offlineComment)" | ||||
|                     [attr.aria-label]="'core.delete' | translate" class="addon-messages-delete-button"> | ||||
|                 <ion-button *ngIf="showDelete" slot="end" fill="clear" [@coreSlideInOut]="'fromRight'" color="danger" | ||||
|                     (click)="deleteComment($event, offlineComment)" [attr.aria-label]="'core.delete' | translate" | ||||
|                     class="addon-messages-delete-button"> | ||||
|                     <ion-icon name="fas-trash" slot="icon-only" aria-hidden="true"></ion-icon> | ||||
|                 </ion-button> | ||||
|             </ion-item> | ||||
| @ -121,8 +116,8 @@ | ||||
| </ion-content> | ||||
| <ion-footer class="footer-adjustable" *ngIf="commentsLoaded && canAddComments"> | ||||
|     <ion-toolbar color="contrast"> | ||||
|         <core-send-message-form [sendDisabled]="sending" [message]="newComment" | ||||
|             (onSubmit)="addComment($event)" [placeholder]="'core.comments.addcomment' | translate"> | ||||
|         <core-send-message-form [sendDisabled]="sending" [message]="newComment" (onSubmit)="addComment($event)" | ||||
|             [placeholder]="'core.comments.addcomment' | translate"> | ||||
|         </core-send-message-form> | ||||
|     </ion-toolbar> | ||||
| </ion-footer> | ||||
|  | ||||
| @ -1,9 +1,8 @@ | ||||
| <ion-header> | ||||
|     <ion-toolbar> | ||||
|         <ion-buttons slot="start"> | ||||
|             <ion-back-button [text]="'core.back' | translate"></ion-back-button> | ||||
|         </ion-buttons> | ||||
|         <h2>{{ 'core.contentlinks.chooseaccount' | translate }}</h2> | ||||
|         <ion-title> | ||||
|             <h2>{{ 'core.contentlinks.chooseaccount' | translate }}</h2> | ||||
|         </ion-title> | ||||
|         <ion-buttons slot="end"> | ||||
|             <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> | ||||
| @ -23,12 +22,13 @@ | ||||
|             <ion-item *ngFor="let site of sites" (click)="siteClicked(site.id)" detail="false" button> | ||||
|                 <ion-avatar slot="start"> | ||||
|                     <img [src]="site.avatar" core-external-content [siteId]="site.id" | ||||
|                         alt="{{ 'core.pictureof' | translate:{$a: site.fullName} }}" | ||||
|                         onError="this.src='assets/img/user-avatar.png'"> | ||||
|                         alt="{{ 'core.pictureof' | translate:{$a: site.fullName} }}" onError="this.src='assets/img/user-avatar.png'"> | ||||
|                 </ion-avatar> | ||||
|                 <ion-label> | ||||
|                     <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> | ||||
|                 </ion-label> | ||||
|             </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