MOBILE-3810 core: Wrap header titles with ion-title
parent
d8718c5eaa
commit
ccfad3b1ac
|
@ -3,8 +3,10 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1 *ngIf="badge">{{ badge.name }}</h1>
|
<h1 *ngIf="badge">{{ badge.name }}</h1>
|
||||||
<h1 *ngIf="!badge">{{ 'addon.badges.badges' | translate }}</h1>
|
<h1 *ngIf="!badge">{{ 'addon.badges.badges' | translate }}</h1>
|
||||||
|
</ion-title>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
</ion-header>
|
</ion-header>
|
||||||
<ion-content>
|
<ion-content>
|
||||||
|
@ -157,7 +159,9 @@
|
||||||
<!-- Endorsement -->
|
<!-- Endorsement -->
|
||||||
<ion-item-group *ngIf="badge.endorsement">
|
<ion-item-group *ngIf="badge.endorsement">
|
||||||
<ion-item-divider>
|
<ion-item-divider>
|
||||||
<ion-label><h2>{{ 'addon.badges.bendorsement' | translate}}</h2></ion-label>
|
<ion-label>
|
||||||
|
<h2>{{ 'addon.badges.bendorsement' | translate}}</h2>
|
||||||
|
</ion-label>
|
||||||
</ion-item-divider>
|
</ion-item-divider>
|
||||||
<ion-item class="ion-text-wrap" *ngIf="badge.endorsement.issuername">
|
<ion-item class="ion-text-wrap" *ngIf="badge.endorsement.issuername">
|
||||||
<ion-label>
|
<ion-label>
|
||||||
|
@ -169,8 +173,7 @@
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<h2>{{ 'addon.badges.issueremail' | translate}}</h2>
|
<h2>{{ 'addon.badges.issueremail' | translate}}</h2>
|
||||||
<p>
|
<p>
|
||||||
<a href="mailto:{{badge.endorsement.issueremail}}" core-link auto-login="no"
|
<a href="mailto:{{badge.endorsement.issueremail}}" core-link auto-login="no" [showBrowserWarning]="false">
|
||||||
[showBrowserWarning]="false">
|
|
||||||
{{ badge.endorsement.issueremail }}
|
{{ badge.endorsement.issueremail }}
|
||||||
</a>
|
</a>
|
||||||
</p>
|
</p>
|
||||||
|
@ -205,27 +208,39 @@
|
||||||
<!-- Related badges -->
|
<!-- Related badges -->
|
||||||
<ion-item-group *ngIf="badge.relatedbadges">
|
<ion-item-group *ngIf="badge.relatedbadges">
|
||||||
<ion-item-divider>
|
<ion-item-divider>
|
||||||
<ion-label><h2>{{ 'addon.badges.relatedbages' | translate}}</h2></ion-label>
|
<ion-label>
|
||||||
|
<h2>{{ 'addon.badges.relatedbages' | translate}}</h2>
|
||||||
|
</ion-label>
|
||||||
</ion-item-divider>
|
</ion-item-divider>
|
||||||
<ion-item class="ion-text-wrap" *ngFor="let relatedBadge of badge.relatedbadges">
|
<ion-item class="ion-text-wrap" *ngFor="let relatedBadge of badge.relatedbadges">
|
||||||
<ion-label><h2>{{ relatedBadge.name }}</h2></ion-label>
|
<ion-label>
|
||||||
|
<h2>{{ relatedBadge.name }}</h2>
|
||||||
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ion-item class="ion-text-wrap" *ngIf="badge.relatedbadges.length == 0">
|
<ion-item class="ion-text-wrap" *ngIf="badge.relatedbadges.length == 0">
|
||||||
<ion-label><h2>{{ 'addon.badges.norelated' | translate}}</h2></ion-label>
|
<ion-label>
|
||||||
|
<h2>{{ 'addon.badges.norelated' | translate}}</h2>
|
||||||
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ion-item-group>
|
</ion-item-group>
|
||||||
|
|
||||||
<!-- Competencies alignment -->
|
<!-- Competencies alignment -->
|
||||||
<ion-item-group *ngIf="badge.alignment">
|
<ion-item-group *ngIf="badge.alignment">
|
||||||
<ion-item-divider>
|
<ion-item-divider>
|
||||||
<ion-label><h2>{{ 'addon.badges.alignment' | translate}}</h2></ion-label>
|
<ion-label>
|
||||||
|
<h2>{{ 'addon.badges.alignment' | translate}}</h2>
|
||||||
|
</ion-label>
|
||||||
</ion-item-divider>
|
</ion-item-divider>
|
||||||
<ion-item class="ion-text-wrap" *ngFor="let alignment of badge.alignment" [href]="alignment.targeturl" core-link
|
<ion-item class="ion-text-wrap" *ngFor="let alignment of badge.alignment" [href]="alignment.targeturl" core-link
|
||||||
auto-login="no">
|
auto-login="no">
|
||||||
<ion-label><h2>{{ alignment.targetname }}</h2></ion-label>
|
<ion-label>
|
||||||
|
<h2>{{ alignment.targetname }}</h2>
|
||||||
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ion-item class="ion-text-wrap" *ngIf="badge.alignment.length == 0">
|
<ion-item class="ion-text-wrap" *ngIf="badge.alignment.length == 0">
|
||||||
<ion-label><h2>{{ 'addon.badges.noalignment' | translate}}</h2></ion-label>
|
<ion-label>
|
||||||
|
<h2>{{ 'addon.badges.noalignment' | translate}}</h2>
|
||||||
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ion-item-group>
|
</ion-item-group>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
|
@ -3,7 +3,9 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>{{ 'addon.badges.badges' | translate }}</h1>
|
<h1>{{ 'addon.badges.badges' | translate }}</h1>
|
||||||
|
</ion-title>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
</ion-header>
|
</ion-header>
|
||||||
<ion-content>
|
<ion-content>
|
||||||
|
@ -12,8 +14,7 @@
|
||||||
<ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content>
|
<ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content>
|
||||||
</ion-refresher>
|
</ion-refresher>
|
||||||
<core-loading [hideUntil]="badges.loaded">
|
<core-loading [hideUntil]="badges.loaded">
|
||||||
<core-empty-box *ngIf="badges.empty" icon="fas-trophy"
|
<core-empty-box *ngIf="badges.empty" icon="fas-trophy" [message]="'addon.badges.nobadges' | translate">
|
||||||
[message]="'addon.badges.nobadges' | translate">
|
|
||||||
</core-empty-box>
|
</core-empty-box>
|
||||||
|
|
||||||
<ion-list *ngIf="!badges.empty" class="ion-no-margin">
|
<ion-list *ngIf="!badges.empty" class="ion-no-margin">
|
||||||
|
|
|
@ -3,7 +3,9 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>{{ title | translate }}</h1>
|
<h1>{{ title | translate }}</h1>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<core-user-menu-button></core-user-menu-button>
|
<core-user-menu-button></core-user-menu-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
@ -18,8 +20,7 @@
|
||||||
<ion-label>{{ 'addon.blog.showonlyyourentries' | translate }}</ion-label>
|
<ion-label>{{ 'addon.blog.showonlyyourentries' | translate }}</ion-label>
|
||||||
<ion-toggle [(ngModel)]="onlyMyEntries" (ionChange)="onlyMyEntriesToggleChanged(onlyMyEntries)"></ion-toggle>
|
<ion-toggle [(ngModel)]="onlyMyEntries" (ionChange)="onlyMyEntriesToggleChanged(onlyMyEntries)"></ion-toggle>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<core-empty-box *ngIf="entries && entries.length == 0" icon="far-newspaper"
|
<core-empty-box *ngIf="entries && entries.length == 0" icon="far-newspaper" [message]="'addon.blog.noentriesyet' | translate">
|
||||||
[message]="'addon.blog.noentriesyet' | translate">
|
|
||||||
</core-empty-box>
|
</core-empty-box>
|
||||||
<ng-container *ngFor="let entry of entries">
|
<ng-container *ngFor="let entry of entries">
|
||||||
<ion-card *ngIf="!onlyMyEntries || entry.userid == currentUserId">
|
<ion-card *ngIf="!onlyMyEntries || entry.userid == currentUserId">
|
||||||
|
@ -27,8 +28,7 @@
|
||||||
<core-user-avatar [user]="entry.user" slot="start" [courseId]="entry.courseid"></core-user-avatar>
|
<core-user-avatar [user]="entry.user" slot="start" [courseId]="entry.courseid"></core-user-avatar>
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<p class="item-heading">
|
<p class="item-heading">
|
||||||
<core-format-text [text]="entry.subject" [contextLevel]="contextLevel"
|
<core-format-text [text]="entry.subject" [contextLevel]="contextLevel" [contextInstanceId]="contextInstanceId">
|
||||||
[contextInstanceId]="contextInstanceId">
|
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
<ion-note class="ion-float-end ion-padding-start ion-text-end">
|
<ion-note class="ion-float-end ion-padding-start ion-text-end">
|
||||||
{{ 'addon.blog.' + entry.publishTranslated! | translate}}
|
{{ 'addon.blog.' + entry.publishTranslated! | translate}}
|
||||||
|
@ -68,8 +68,8 @@
|
||||||
</ion-card-content>
|
</ion-card-content>
|
||||||
<div class="ion-text-center ion-margin-bottom" *ngIf="entry.lastmodified > entry.created">
|
<div class="ion-text-center ion-margin-bottom" *ngIf="entry.lastmodified > entry.created">
|
||||||
<ion-note>
|
<ion-note>
|
||||||
<ion-icon name="fas-clock"
|
<ion-icon name="fas-clock" [attr.aria-label]="'core.lastmodified' | translate"></ion-icon> {{entry.lastmodified |
|
||||||
[attr.aria-label]="'core.lastmodified' | translate"></ion-icon> {{entry.lastmodified | coreTimeAgo}}
|
coreTimeAgo}}
|
||||||
</ion-note>
|
</ion-note>
|
||||||
</div>
|
</div>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
<ion-header>
|
<ion-header>
|
||||||
<ion-toolbar>
|
<ion-toolbar>
|
||||||
|
<ion-title>
|
||||||
<h2>{{ 'addon.calendar.reminders' | translate }}</h2>
|
<h2>{{ 'addon.calendar.reminders' | translate }}</h2>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
<ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
||||||
<ion-icon slot="icon-only" name="fas-times" aria-hidden="true"></ion-icon>
|
<ion-icon slot="icon-only" name="fas-times" aria-hidden="true"></ion-icon>
|
||||||
|
@ -36,15 +38,13 @@
|
||||||
|
|
||||||
<div class="flex-row">
|
<div class="flex-row">
|
||||||
<!-- Input to enter the value. -->
|
<!-- Input to enter the value. -->
|
||||||
<ion-input type="number" name="customvalue" [(ngModel)]="customValue" [disabled]="radioValue != 'custom'"
|
<ion-input type="number" name="customvalue" [(ngModel)]="customValue" [disabled]="radioValue != 'custom'" placeholder="10">
|
||||||
placeholder="10">
|
|
||||||
</ion-input>
|
</ion-input>
|
||||||
|
|
||||||
<!-- Units. -->
|
<!-- Units. -->
|
||||||
<label class="accesshide" for="reminderUnits">{{ 'addon.calendar.units' | translate }}</label>
|
<label class="accesshide" for="reminderUnits">{{ 'addon.calendar.units' | translate }}</label>
|
||||||
<ion-select id="reminderUnits" name="customunits" [(ngModel)]="customUnits" interface="action-sheet"
|
<ion-select id="reminderUnits" name="customunits" [(ngModel)]="customUnits" interface="action-sheet"
|
||||||
[disabled]="radioValue != 'custom'" slot="end"
|
[disabled]="radioValue != 'custom'" slot="end" [interfaceOptions]="{header: 'addon.calendar.units' | translate}">
|
||||||
[interfaceOptions]="{header: 'addon.calendar.units' | translate}">
|
|
||||||
<ion-select-option *ngFor="let option of customUnitsOptions" [value]="option.value">
|
<ion-select-option *ngFor="let option of customUnitsOptions" [value]="option.value">
|
||||||
{{ option.label | translate }}
|
{{ option.label | translate }}
|
||||||
</ion-select-option>
|
</ion-select-option>
|
||||||
|
|
|
@ -3,7 +3,9 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>{{ 'addon.calendar.calendarevents' | translate }}</h1>
|
<h1>{{ 'addon.calendar.calendarevents' | translate }}</h1>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button fill="clear" (click)="openFilter($event)" [attr.aria-label]="'core.filter' | translate">
|
<ion-button fill="clear" (click)="openFilter($event)" [attr.aria-label]="'core.filter' | translate">
|
||||||
<ion-icon slot="icon-only" name="fas-filter" aria-hidden="true"></ion-icon>
|
<ion-icon slot="icon-only" name="fas-filter" aria-hidden="true"></ion-icon>
|
||||||
|
@ -13,8 +15,8 @@
|
||||||
iconAction="fas-calendar-day" (action)="goToCurrentDay()">
|
iconAction="fas-calendar-day" (action)="goToCurrentDay()">
|
||||||
</core-context-menu-item>
|
</core-context-menu-item>
|
||||||
<core-context-menu-item [hidden]="!loaded || !hasOffline || !isOnline" [priority]="400"
|
<core-context-menu-item [hidden]="!loaded || !hasOffline || !isOnline" [priority]="400"
|
||||||
[content]="'core.settings.synchronizenow' | translate" (action)="doRefresh(undefined, $event)"
|
[content]="'core.settings.synchronizenow' | translate" (action)="doRefresh(undefined, $event)" [iconAction]="syncIcon"
|
||||||
[iconAction]="syncIcon" [closeOnClick]="false">
|
[closeOnClick]="false">
|
||||||
</core-context-menu-item>
|
</core-context-menu-item>
|
||||||
</core-context-menu>
|
</core-context-menu>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
|
|
@ -3,7 +3,9 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>{{ title | translate }}</h1>
|
<h1>{{ title | translate }}</h1>
|
||||||
|
</ion-title>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
</ion-header>
|
</ion-header>
|
||||||
<ion-content>
|
<ion-content>
|
||||||
|
@ -40,12 +42,8 @@
|
||||||
<p class="item-heading" [core-mark-required]="true">{{ 'addon.calendar.eventkind' | translate }}</p>
|
<p class="item-heading" [core-mark-required]="true">{{ 'addon.calendar.eventkind' | translate }}</p>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
<p *ngIf="eventTypes.length == 1" slot="end">{{eventTypes[0].name | translate }}</p>
|
<p *ngIf="eventTypes.length == 1" slot="end">{{eventTypes[0].name | translate }}</p>
|
||||||
<ion-select
|
<ion-select *ngIf="eventTypes.length > 1" formControlName="eventtype" interface="action-sheet"
|
||||||
*ngIf="eventTypes.length > 1"
|
[interfaceOptions]="{header: 'addon.calendar.eventkind' | translate}">
|
||||||
formControlName="eventtype"
|
|
||||||
interface="action-sheet"
|
|
||||||
[interfaceOptions]="{header: 'addon.calendar.eventkind' | translate}"
|
|
||||||
>
|
|
||||||
<ion-select-option *ngFor="let type of eventTypes" [value]="type.value">
|
<ion-select-option *ngFor="let type of eventTypes" [value]="type.value">
|
||||||
{{ type.name | translate }}
|
{{ type.name | translate }}
|
||||||
</ion-select-option>
|
</ion-select-option>
|
||||||
|
@ -83,8 +81,7 @@
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<p class="item-heading" [core-mark-required]="true">{{ 'core.course' | translate }}</p>
|
<p class="item-heading" [core-mark-required]="true">{{ 'core.course' | translate }}</p>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
<ion-select formControlName="groupcourseid"
|
<ion-select formControlName="groupcourseid" interface="action-sheet" [placeholder]="'core.noselection' | translate"
|
||||||
interface="action-sheet" [placeholder]="'core.noselection' | translate"
|
|
||||||
(ionChange)="groupCourseSelected()" [interfaceOptions]="{header: 'core.course' | translate}">
|
(ionChange)="groupCourseSelected()" [interfaceOptions]="{header: 'core.course' | translate}">
|
||||||
<ion-select-option *ngFor="let course of courses" [value]="course.id">
|
<ion-select-option *ngFor="let course of courses" [value]="course.id">
|
||||||
{{ course.fullname }}
|
{{ course.fullname }}
|
||||||
|
@ -93,7 +90,9 @@
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<!-- The course has no groups. -->
|
<!-- The course has no groups. -->
|
||||||
<ion-item class="ion-text-wrap core-danger-item" *ngIf="!loadingGroups && courseGroupSet && !groups.length">
|
<ion-item class="ion-text-wrap core-danger-item" *ngIf="!loadingGroups && courseGroupSet && !groups.length">
|
||||||
<ion-label><p>{{ 'core.coursenogroups' | translate }}</p></ion-label>
|
<ion-label>
|
||||||
|
<p>{{ 'core.coursenogroups' | translate }}</p>
|
||||||
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<!-- Select the group. -->
|
<!-- Select the group. -->
|
||||||
<ion-item class="ion-text-wrap" *ngIf="!loadingGroups && groups.length > 0">
|
<ion-item class="ion-text-wrap" *ngIf="!loadingGroups && groups.length > 0">
|
||||||
|
@ -128,8 +127,7 @@
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<p>{{ reminder.label }}</p>
|
<p>{{ reminder.label }}</p>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
<ion-button fill="clear" (click)="removeReminder(reminder)" [attr.aria-label]="'core.delete' | translate"
|
<ion-button fill="clear" (click)="removeReminder(reminder)" [attr.aria-label]="'core.delete' | translate" slot="end">
|
||||||
slot="end">
|
|
||||||
<ion-icon name="fas-trash" color="danger" slot="icon-only" aria-hidden="true"></ion-icon>
|
<ion-icon name="fas-trash" color="danger" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
@ -158,8 +156,7 @@
|
||||||
<ion-item *ngIf="form.controls.duration.value === 1">
|
<ion-item *ngIf="form.controls.duration.value === 1">
|
||||||
<ion-label position="stacked"></ion-label>
|
<ion-label position="stacked"></ion-label>
|
||||||
<ion-datetime formControlName="timedurationuntil" [max]="maxDate" [min]="minDate"
|
<ion-datetime formControlName="timedurationuntil" [max]="maxDate" [min]="minDate"
|
||||||
[placeholder]="'addon.calendar.durationuntil' | translate"
|
[placeholder]="'addon.calendar.durationuntil' | translate" [displayFormat]="dateFormat" display-timezone="utc">
|
||||||
[displayFormat]="dateFormat" display-timezone="utc">
|
|
||||||
</ion-datetime>
|
</ion-datetime>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ion-item lines="none">
|
<ion-item lines="none">
|
||||||
|
@ -171,8 +168,7 @@
|
||||||
<ion-item *ngIf="form.controls.duration.value === 2">
|
<ion-item *ngIf="form.controls.duration.value === 2">
|
||||||
<ion-label class="sr-only">{{ 'addon.calendar.durationminutes' | translate }}</ion-label>
|
<ion-label class="sr-only">{{ 'addon.calendar.durationminutes' | translate }}</ion-label>
|
||||||
<ion-input type="number" name="timedurationminutes" slot="end"
|
<ion-input type="number" name="timedurationminutes" slot="end"
|
||||||
[placeholder]="'addon.calendar.durationminutes' | translate"
|
[placeholder]="'addon.calendar.durationminutes' | translate" formControlName="timedurationminutes"></ion-input>
|
||||||
formControlName="timedurationminutes"></ion-input>
|
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ion-radio-group>
|
</ion-radio-group>
|
||||||
</div>
|
</div>
|
||||||
|
@ -223,8 +219,8 @@
|
||||||
<p class="item-heading">{{ 'core.description' | translate }}</p>
|
<p class="item-heading">{{ 'core.description' | translate }}</p>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
<core-rich-text-editor [control]="descriptionControl" [attr.aria-label]="'core.description' | translate"
|
<core-rich-text-editor [control]="descriptionControl" [attr.aria-label]="'core.description' | translate"
|
||||||
[placeholder]="'core.description' | translate" name="description" [component]="component"
|
[placeholder]="'core.description' | translate" name="description" [component]="component" [componentId]="eventId"
|
||||||
[componentId]="eventId" [autoSave]="false"></core-rich-text-editor>
|
[autoSave]="false"></core-rich-text-editor>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
|
||||||
<!-- Location. -->
|
<!-- Location. -->
|
||||||
|
|
|
@ -3,30 +3,31 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1 *ngIf="event">
|
<h1 *ngIf="event">
|
||||||
<core-mod-icon *ngIf="event.moduleIcon" [modicon]="event.moduleIcon" [showAlt]="false"
|
<core-mod-icon *ngIf="event.moduleIcon" [modicon]="event.moduleIcon" [showAlt]="false" [modname]="event.modulename"
|
||||||
[modname]="event.modulename" [componentId]="event.instance"></core-mod-icon>
|
[componentId]="event.instance"></core-mod-icon>
|
||||||
<ion-icon *ngIf="event.eventIcon && !event.moduleIcon" [name]="event.eventIcon" aria-hidden="true"></ion-icon>
|
<ion-icon *ngIf="event.eventIcon && !event.moduleIcon" [name]="event.eventIcon" aria-hidden="true"></ion-icon>
|
||||||
<!-- Add the icon title so accessibility tools read it. -->
|
<!-- Add the icon title so accessibility tools read it. -->
|
||||||
<span class="sr-only">
|
<span class="sr-only">
|
||||||
{{ 'addon.calendar.type' + event.formattedType | translate }}
|
{{ 'addon.calendar.type' + event.formattedType | translate }}
|
||||||
<span class="sr-only" *ngIf="event.moduleIcon && event.iconTitle">{{ event.iconTitle }}</span>
|
<span class="sr-only" *ngIf="event.moduleIcon && event.iconTitle">{{ event.iconTitle }}</span>
|
||||||
</span>
|
</span>
|
||||||
<core-format-text [text]="event.name" [contextLevel]="event.contextLevel"
|
<core-format-text [text]="event.name" [contextLevel]="event.contextLevel" [contextInstanceId]="event.contextInstanceId">
|
||||||
[contextInstanceId]="event.contextInstanceId"></core-format-text>
|
</core-format-text>
|
||||||
</h1>
|
</h1>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<core-context-menu>
|
<core-context-menu>
|
||||||
<core-context-menu-item [hidden]="!eventLoaded || (!hasOffline && event && !event.deleted) || !isOnline"
|
<core-context-menu-item [hidden]="!eventLoaded || (!hasOffline && event && !event.deleted) || !isOnline" [priority]="400"
|
||||||
[priority]="400" [content]="'core.settings.synchronizenow' | translate" (action)="doRefresh(undefined, $event, true)"
|
[content]="'core.settings.synchronizenow' | translate" (action)="doRefresh(undefined, $event, true)"
|
||||||
[iconAction]="syncIcon" [closeOnClick]="false">
|
[iconAction]="syncIcon" [closeOnClick]="false">
|
||||||
</core-context-menu-item>
|
</core-context-menu-item>
|
||||||
<core-context-menu-item [hidden]="!event || !event.canedit || event.deleted || (!canEdit && event.id > 0)"
|
<core-context-menu-item [hidden]="!event || !event.canedit || event.deleted || (!canEdit && event.id > 0)" [priority]="300"
|
||||||
[priority]="300" [content]="'core.edit' | translate" (action)="openEdit()" iconAction="fas-edit">
|
[content]="'core.edit' | translate" (action)="openEdit()" iconAction="fas-edit">
|
||||||
</core-context-menu-item>
|
</core-context-menu-item>
|
||||||
<core-context-menu-item [hidden]="!event || !event.candelete || event.deleted" [priority]="200"
|
<core-context-menu-item [hidden]="!event || !event.candelete || event.deleted" [priority]="200"
|
||||||
[content]="'core.delete' | translate" (action)="deleteEvent()"
|
[content]="'core.delete' | translate" (action)="deleteEvent()" iconAction="fas-trash"></core-context-menu-item>
|
||||||
iconAction="fas-trash"></core-context-menu-item>
|
|
||||||
<core-context-menu-item [hidden]="!event || !event.deleted" [priority]="200" [content]="'core.restore' | translate"
|
<core-context-menu-item [hidden]="!event || !event.deleted" [priority]="200" [content]="'core.restore' | translate"
|
||||||
(action)="undoDelete()" iconAction="fas-undo-alt"></core-context-menu-item>
|
(action)="undoDelete()" iconAction="fas-undo-alt"></core-context-menu-item>
|
||||||
</core-context-menu>
|
</core-context-menu>
|
||||||
|
@ -82,8 +83,10 @@
|
||||||
<ion-item class="ion-text-wrap" *ngIf="categoryPath">
|
<ion-item class="ion-text-wrap" *ngIf="categoryPath">
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<h2>{{ 'core.category' | translate}}</h2>
|
<h2>{{ 'core.category' | translate}}</h2>
|
||||||
<p><core-format-text [text]="categoryPath" contextLevel="coursecat"
|
<p>
|
||||||
[contextInstanceId]="event.categoryid"></core-format-text></p>
|
<core-format-text [text]="categoryPath" contextLevel="coursecat" [contextInstanceId]="event.categoryid">
|
||||||
|
</core-format-text>
|
||||||
|
</p>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ion-item class="ion-text-wrap" *ngIf="event.description">
|
<ion-item class="ion-text-wrap" *ngIf="event.description">
|
||||||
|
@ -123,13 +126,12 @@
|
||||||
</ion-label>
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ng-container *ngFor="let reminder of reminders">
|
<ng-container *ngFor="let reminder of reminders">
|
||||||
<ion-item *ngIf="reminder.timestamp > 0" class="ion-text-wrap"
|
<ion-item *ngIf="reminder.timestamp > 0" class="ion-text-wrap" [class.item-dimmed]="reminder.timestamp <= currentTime">
|
||||||
[class.item-dimmed]="reminder.timestamp <= currentTime">
|
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<p>{{ reminder.label }}</p>
|
<p>{{ reminder.label }}</p>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
<ion-button fill="clear" (click)="cancelNotification(reminder.id, $event)"
|
<ion-button fill="clear" (click)="cancelNotification(reminder.id, $event)" [attr.aria-label]="'core.delete' | translate"
|
||||||
[attr.aria-label]="'core.delete' | translate" slot="end" *ngIf="reminder.timestamp > currentTime">
|
slot="end" *ngIf="reminder.timestamp > currentTime">
|
||||||
<ion-icon name="fas-trash" color="danger" slot="icon-only" aria-hidden="true"></ion-icon>
|
<ion-icon name="fas-trash" color="danger" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
|
|
@ -3,20 +3,20 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>{{ (showCalendar ? 'addon.calendar.calendarevents' : 'addon.calendar.upcomingevents') | translate }}</h1>
|
<h1>{{ (showCalendar ? 'addon.calendar.calendarevents' : 'addon.calendar.upcomingevents') | translate }}</h1>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button fill="clear" (click)="openFilter($event)" [attr.aria-label]="'core.filter' | translate">
|
<ion-button fill="clear" (click)="openFilter($event)" [attr.aria-label]="'core.filter' | translate">
|
||||||
<ion-icon slot="icon-only" name="fas-filter" aria-hidden="true"></ion-icon>
|
<ion-icon slot="icon-only" name="fas-filter" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
<core-context-menu>
|
<core-context-menu>
|
||||||
<core-context-menu-item *ngIf="showCalendar" [priority]="800"
|
<core-context-menu-item *ngIf="showCalendar" [priority]="800" [content]="'addon.calendar.upcomingevents' | translate"
|
||||||
[content]="'addon.calendar.upcomingevents' | translate" iconAction="fas-th-list"
|
iconAction="fas-th-list" (action)="toggleDisplay()"></core-context-menu-item>
|
||||||
(action)="toggleDisplay()"></core-context-menu-item>
|
<core-context-menu-item *ngIf="!showCalendar" [priority]="800" [content]="'addon.calendar.monthlyview' | translate"
|
||||||
<core-context-menu-item *ngIf="!showCalendar" [priority]="800"
|
iconAction="fas-calendar-alt" (action)="toggleDisplay()"></core-context-menu-item>
|
||||||
[content]="'addon.calendar.monthlyview' | translate" iconAction="fas-calendar-alt"
|
<core-context-menu-item [hidden]="!notificationsEnabled" [priority]="600" [content]="'core.settings.settings' | translate"
|
||||||
(action)="toggleDisplay()"></core-context-menu-item>
|
(action)="openSettings()" iconAction="fas-cogs">
|
||||||
<core-context-menu-item [hidden]="!notificationsEnabled" [priority]="600"
|
|
||||||
[content]="'core.settings.settings' | translate" (action)="openSettings()" iconAction="fas-cogs">
|
|
||||||
</core-context-menu-item>
|
</core-context-menu-item>
|
||||||
<core-context-menu-item [hidden]="!loaded || !hasOffline || !isOnline" [priority]="400"
|
<core-context-menu-item [hidden]="!loaded || !hasOffline || !isOnline" [priority]="400"
|
||||||
[content]="'core.settings.synchronizenow' | translate" (action)="doRefresh(undefined, $event, true)"
|
[content]="'core.settings.synchronizenow' | translate" (action)="doRefresh(undefined, $event, true)"
|
||||||
|
@ -43,8 +43,7 @@
|
||||||
[displayNavButtons]="showCalendar" (onEventClicked)="gotoEvent($event)" (onDayClicked)="gotoDay($event)">
|
[displayNavButtons]="showCalendar" (onEventClicked)="gotoEvent($event)" (onDayClicked)="gotoDay($event)">
|
||||||
</addon-calendar-calendar>
|
</addon-calendar-calendar>
|
||||||
|
|
||||||
<addon-calendar-upcoming-events *ngIf="loadUpcoming" [hidden]="showCalendar" [filter]="filter"
|
<addon-calendar-upcoming-events *ngIf="loadUpcoming" [hidden]="showCalendar" [filter]="filter" (onEventClicked)="gotoEvent($event)">
|
||||||
(onEventClicked)="gotoEvent($event)">
|
|
||||||
</addon-calendar-upcoming-events>
|
</addon-calendar-upcoming-events>
|
||||||
|
|
||||||
<!-- Create a calendar event. -->
|
<!-- Create a calendar event. -->
|
||||||
|
|
|
@ -3,7 +3,9 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>{{ 'core.settings.settings' | translate }}</h1>
|
<h1>{{ 'core.settings.settings' | translate }}</h1>
|
||||||
|
</ion-title>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
</ion-header>
|
</ion-header>
|
||||||
<ion-content>
|
<ion-content>
|
||||||
|
|
|
@ -3,7 +3,9 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>{{ title }}</h1>
|
<h1>{{ title }}</h1>
|
||||||
|
</ion-title>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
</ion-header>
|
</ion-header>
|
||||||
<ion-content>
|
<ion-content>
|
||||||
|
|
|
@ -3,9 +3,11 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1 *ngIf="competency">
|
<h1 *ngIf="competency">
|
||||||
{{ competency.competency.competency.shortname }} <small>{{ competency.competency.competency.idnumber }}</small>
|
{{ competency.competency.competency.shortname }} <small>{{ competency.competency.competency.idnumber }}</small>
|
||||||
</h1>
|
</h1>
|
||||||
|
</ion-title>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
</ion-header>
|
</ion-header>
|
||||||
<ion-content>
|
<ion-content>
|
||||||
|
@ -16,7 +18,9 @@
|
||||||
<ion-card *ngIf="user">
|
<ion-card *ngIf="user">
|
||||||
<ion-item class="ion-text-wrap">
|
<ion-item class="ion-text-wrap">
|
||||||
<core-user-avatar [user]="user" slot="start"></core-user-avatar>
|
<core-user-avatar [user]="user" slot="start"></core-user-avatar>
|
||||||
<ion-label><h2>{{ user.fullname }}</h2></ion-label>
|
<ion-label>
|
||||||
|
<h2>{{ user.fullname }}</h2>
|
||||||
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
|
||||||
|
@ -32,11 +36,9 @@
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<p class="item-heading">{{ 'addon.competency.path' | translate }}</p>
|
<p class="item-heading">{{ 'addon.competency.path' | translate }}</p>
|
||||||
<p>
|
<p>
|
||||||
<a *ngIf="competency.competency.comppath.showlinks"
|
<a *ngIf="competency.competency.comppath.showlinks" [href]="competency.competency.comppath.pluginbaseurl + '/competencies.php?competencyframeworkid=' +
|
||||||
[href]="competency.competency.comppath.pluginbaseurl + '/competencies.php?competencyframeworkid=' +
|
|
||||||
competency.competency.comppath.framework.id + '&pagecontextid=' +
|
competency.competency.comppath.framework.id + '&pagecontextid=' +
|
||||||
competency.competency.comppath.pagecontextid"
|
competency.competency.comppath.pagecontextid" core-link>
|
||||||
core-link>
|
|
||||||
{{ competency.competency.comppath.framework.name }}
|
{{ competency.competency.comppath.framework.name }}
|
||||||
</a>
|
</a>
|
||||||
<ng-container *ngIf="!competency.competency.comppath.showlinks">
|
<ng-container *ngIf="!competency.competency.comppath.showlinks">
|
||||||
|
@ -129,7 +131,9 @@
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ion-item class="ion-text-wrap">
|
<ion-item class="ion-text-wrap">
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<p><ion-badge color="dark">{{ evidence.gradename }}</ion-badge></p>
|
<p>
|
||||||
|
<ion-badge color="dark">{{ evidence.gradename }}</ion-badge>
|
||||||
|
</p>
|
||||||
<p class="ion-margin-top" *ngIf="evidence.description">{{ evidence.description }}</p>
|
<p class="ion-margin-top" *ngIf="evidence.description">{{ evidence.description }}</p>
|
||||||
<blockquote *ngIf="evidence.note">{{ evidence.note }}</blockquote>
|
<blockquote *ngIf="evidence.note">{{ evidence.note }}</blockquote>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
|
|
|
@ -3,9 +3,11 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1 *ngIf="competency">
|
<h1 *ngIf="competency">
|
||||||
{{ competency.competency.shortname }} <small>{{ competency.competency.idnumber }}</small>
|
{{ competency.competency.shortname }} <small>{{ competency.competency.idnumber }}</small>
|
||||||
</h1>
|
</h1>
|
||||||
|
</ion-title>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
</ion-header>
|
</ion-header>
|
||||||
<ion-content>
|
<ion-content>
|
||||||
|
|
|
@ -3,7 +3,9 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>{{ 'addon.competency.coursecompetencies' | translate }}</h1>
|
<h1>{{ 'addon.competency.coursecompetencies' | translate }}</h1>
|
||||||
|
</ion-title>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
</ion-header>
|
</ion-header>
|
||||||
<ion-content>
|
<ion-content>
|
||||||
|
@ -50,11 +52,13 @@
|
||||||
<ion-card *ngIf="user">
|
<ion-card *ngIf="user">
|
||||||
<ion-item class="ion-text-wrap">
|
<ion-item class="ion-text-wrap">
|
||||||
<core-user-avatar [user]="user" slot="start"></core-user-avatar>
|
<core-user-avatar [user]="user" slot="start"></core-user-avatar>
|
||||||
<ion-label><h2>{{ user.fullname }}</h2></ion-label>
|
<ion-label>
|
||||||
|
<h2>{{ user.fullname }}</h2>
|
||||||
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
<core-empty-box *ngIf="competencies && competencies.statistics.competencycount == 0"
|
<core-empty-box *ngIf="competencies && competencies.statistics.competencycount == 0" icon="fas-award"
|
||||||
icon="fas-award" message="{{ 'addon.competency.nocompetenciesincourse' | translate }}">
|
message="{{ 'addon.competency.nocompetenciesincourse' | translate }}">
|
||||||
</core-empty-box>
|
</core-empty-box>
|
||||||
|
|
||||||
<div *ngIf="competencies">
|
<div *ngIf="competencies">
|
||||||
|
@ -81,10 +85,9 @@
|
||||||
<div>
|
<div>
|
||||||
<p class="item-heading">{{ 'addon.competency.path' | translate }}</p>
|
<p class="item-heading">{{ 'addon.competency.path' | translate }}</p>
|
||||||
<p>
|
<p>
|
||||||
<a *ngIf="competency.comppath.showlinks"
|
<a *ngIf="competency.comppath.showlinks" [href]="competency.comppath.pluginbaseurl + '/competencies.php?competencyframeworkid=' +
|
||||||
[href]="competency.comppath.pluginbaseurl + '/competencies.php?competencyframeworkid=' +
|
competency.comppath.framework.id + '&pagecontextid=' + competency.comppath.pagecontextid" core-link
|
||||||
competency.comppath.framework.id + '&pagecontextid=' + competency.comppath.pagecontextid"
|
[title]="competency.comppath.framework.name">
|
||||||
core-link [title]="competency.comppath.framework.name">
|
|
||||||
{{ competency.comppath.framework.name }}
|
{{ competency.comppath.framework.name }}
|
||||||
</a>
|
</a>
|
||||||
<ng-container *ngIf="!competency.comppath.showlinks">
|
<ng-container *ngIf="!competency.comppath.showlinks">
|
||||||
|
|
|
@ -3,7 +3,9 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1 *ngIf="plan">{{plan.plan.name}}</h1>
|
<h1 *ngIf="plan">{{plan.plan.name}}</h1>
|
||||||
|
</ion-title>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
</ion-header>
|
</ion-header>
|
||||||
<ion-content>
|
<ion-content>
|
||||||
|
@ -24,8 +26,7 @@
|
||||||
<ion-item class="ion-text-wrap" *ngIf="plan.plan.description" lines="none">
|
<ion-item class="ion-text-wrap" *ngIf="plan.plan.description" lines="none">
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<p>
|
<p>
|
||||||
<core-format-text [text]="plan.plan.description" contextLevel="user"
|
<core-format-text [text]="plan.plan.description" contextLevel="user" [contextInstanceId]="plan.plan.userid">
|
||||||
[contextInstanceId]="plan.plan.userid">
|
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</p>
|
</p>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
|
@ -74,8 +75,8 @@
|
||||||
</ion-label>
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ion-item class="ion-text-wrap" *ngFor="let competency of plan.competencies"
|
<ion-item class="ion-text-wrap" *ngFor="let competency of plan.competencies"
|
||||||
(click)="openCompetency(competency.competency.id)"
|
(click)="openCompetency(competency.competency.id)" [attr.aria-label]="competency.competency.shortname" detail="true"
|
||||||
[attr.aria-label]="competency.competency.shortname" detail="true" button>
|
button>
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<p class="item-heading">{{competency.competency.shortname}} <em>{{competency.competency.idnumber}}</em></p>
|
<p class="item-heading">{{competency.competency.shortname}} <em>{{competency.competency.idnumber}}</em></p>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
|
|
|
@ -3,7 +3,9 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>{{ 'addon.competency.userplans' | translate }}</h1>
|
<h1>{{ 'addon.competency.userplans' | translate }}</h1>
|
||||||
|
</ion-title>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
</ion-header>
|
</ion-header>
|
||||||
<ion-content>
|
<ion-content>
|
||||||
|
@ -16,8 +18,8 @@
|
||||||
|
|
||||||
</core-empty-box>
|
</core-empty-box>
|
||||||
<ion-list *ngIf="!plans.empty" class="ion-no-margin">
|
<ion-list *ngIf="!plans.empty" class="ion-no-margin">
|
||||||
<ion-item class="ion-text-wrap" *ngFor="let plan of plans.items" [attr.aria-label]="plan.name"
|
<ion-item class="ion-text-wrap" *ngFor="let plan of plans.items" [attr.aria-label]="plan.name" (click)="plans.select(plan)"
|
||||||
(click)="plans.select(plan)" [attr.aria-current]="plans.getItemAriaCurrent(plan)" button detail="true">
|
[attr.aria-current]="plans.getItemAriaCurrent(plan)" button detail="true">
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<p class="item-heading">{{ plan.name }}</p>
|
<p class="item-heading">{{ plan.name }}</p>
|
||||||
<p *ngIf="plan.duedate > 0">
|
<p *ngIf="plan.duedate > 0">
|
||||||
|
|
|
@ -3,7 +3,9 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>{{ 'addon.coursecompletion.coursecompletion' | translate }}</h1>
|
<h1>{{ 'addon.coursecompletion.coursecompletion' | translate }}</h1>
|
||||||
|
</ion-title>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
</ion-header>
|
</ion-header>
|
||||||
<ion-content>
|
<ion-content>
|
||||||
|
@ -28,14 +30,18 @@
|
||||||
</ion-card>
|
</ion-card>
|
||||||
<ion-card *ngIf="completion && tracked">
|
<ion-card *ngIf="completion && tracked">
|
||||||
<ion-item-divider>
|
<ion-item-divider>
|
||||||
<ion-label><h2>{{ 'addon.coursecompletion.requiredcriteria' | translate }}</h2></ion-label>
|
<ion-label>
|
||||||
|
<h2>{{ 'addon.coursecompletion.requiredcriteria' | translate }}</h2>
|
||||||
|
</ion-label>
|
||||||
</ion-item-divider>
|
</ion-item-divider>
|
||||||
<ion-item class="ion-hide-md-up ion-text-wrap" *ngFor="let criteria of completion.completions">
|
<ion-item class="ion-hide-md-up ion-text-wrap" *ngFor="let criteria of completion.completions">
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<p class="item-heading">
|
<p class="item-heading">
|
||||||
<core-format-text clean="true" [text]="criteria.details.criteria" [filter]="false"></core-format-text>
|
<core-format-text clean="true" [text]="criteria.details.criteria" [filter]="false"></core-format-text>
|
||||||
</p>
|
</p>
|
||||||
<p><core-format-text clean="true" [text]="criteria.details.requirement" [filter]="false"></core-format-text></p>
|
<p>
|
||||||
|
<core-format-text clean="true" [text]="criteria.details.requirement" [filter]="false"></core-format-text>
|
||||||
|
</p>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
<strong slot="end">{{ criteria.status }}</strong>
|
<strong slot="end">{{ criteria.status }}</strong>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
@ -73,7 +79,9 @@
|
||||||
</ion-card>
|
</ion-card>
|
||||||
<ion-card *ngIf="showSelfComplete && tracked">
|
<ion-card *ngIf="showSelfComplete && tracked">
|
||||||
<ion-item-divider>
|
<ion-item-divider>
|
||||||
<ion-label><h2>{{ 'addon.coursecompletion.manualselfcompletion' | translate }}</h2></ion-label>
|
<ion-label>
|
||||||
|
<h2>{{ 'addon.coursecompletion.manualselfcompletion' | translate }}</h2>
|
||||||
|
</ion-label>
|
||||||
</ion-item-divider>
|
</ion-item-divider>
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-label>
|
<ion-label>
|
||||||
|
|
|
@ -3,7 +3,9 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>{{ 'addon.messageoutput_airnotifier.processorsettingsdesc' | translate }}</h1>
|
<h1>{{ 'addon.messageoutput_airnotifier.processorsettingsdesc' | translate }}</h1>
|
||||||
|
</ion-title>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
</ion-header>
|
</ion-header>
|
||||||
<ion-content>
|
<ion-content>
|
||||||
|
@ -21,10 +23,7 @@
|
||||||
<p>{{ device.platform }} {{ device.version }}</p>
|
<p>{{ device.platform }} {{ device.version }}</p>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
<core-button-with-spinner [loading]="device.updating" slot="end">
|
<core-button-with-spinner [loading]="device.updating" slot="end">
|
||||||
<ion-toggle
|
<ion-toggle [(ngModel)]="device.enable" (ngModelChange)="enableDevice(device, device.enable)">
|
||||||
[(ngModel)]="device.enable"
|
|
||||||
(ngModelChange)="enableDevice(device, device.enable)"
|
|
||||||
>
|
|
||||||
</ion-toggle>
|
</ion-toggle>
|
||||||
</core-button-with-spinner>
|
</core-button-with-spinner>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
<ion-header>
|
<ion-header>
|
||||||
<ion-toolbar>
|
<ion-toolbar>
|
||||||
|
<ion-title>
|
||||||
<h2>{{ 'addon.messages.groupinfo' | translate }}</h2>
|
<h2>{{ 'addon.messages.groupinfo' | translate }}</h2>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
<ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
||||||
<ion-icon name="fas-times" slot="icon-only" aria-hidden="true"></ion-icon>
|
<ion-icon name="fas-times" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
|
@ -32,8 +34,8 @@
|
||||||
</ion-label>
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
|
||||||
<ion-item class="ion-text-wrap addon-messages-conversation-item" *ngFor="let member of members"
|
<ion-item class="ion-text-wrap addon-messages-conversation-item" *ngFor="let member of members" (click)="closeModal(member.id)"
|
||||||
(click)="closeModal(member.id)" detail="true" button>
|
detail="true" button>
|
||||||
<core-user-avatar [user]="member" [linkProfile]="false" [checkOnline]="member.showonlinestatus" slot="start">
|
<core-user-avatar [user]="member" [linkProfile]="false" [checkOnline]="member.showonlinestatus" slot="start">
|
||||||
</core-user-avatar>
|
</core-user-avatar>
|
||||||
<ion-label>
|
<ion-label>
|
||||||
|
|
|
@ -3,7 +3,9 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>{{ 'addon.messages.contacts' | translate }}</h1>
|
<h1>{{ 'addon.messages.contacts' | translate }}</h1>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
|
@ -14,9 +16,8 @@
|
||||||
<ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content>
|
<ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content>
|
||||||
</ion-refresher>
|
</ion-refresher>
|
||||||
|
|
||||||
<core-search-box (onSubmit)="search($event)" (onClear)="clearSearch()"
|
<core-search-box (onSubmit)="search($event)" (onClear)="clearSearch()" [placeholder]="'addon.messages.contactname' | translate"
|
||||||
[placeholder]="'addon.messages.contactname' | translate" autocorrect="off" spellcheck="false" lengthCheck="2"
|
autocorrect="off" spellcheck="false" lengthCheck="2" [disabled]="!loaded" searchArea="AddonMessagesContacts"></core-search-box>
|
||||||
[disabled]="!loaded" searchArea="AddonMessagesContacts"></core-search-box>
|
|
||||||
|
|
||||||
<core-loading [hideUntil]="loaded" [message]="loadingMessage">
|
<core-loading [hideUntil]="loaded" [message]="loadingMessage">
|
||||||
<core-empty-box *ngIf="!hasContacts && searchString == ''" icon="fas-address-book"
|
<core-empty-box *ngIf="!hasContacts && searchString == ''" icon="fas-address-book"
|
||||||
|
@ -28,17 +29,23 @@
|
||||||
<ion-list *ngFor="let contactType of contactTypes" class="ion-no-margin">
|
<ion-list *ngFor="let contactType of contactTypes" class="ion-no-margin">
|
||||||
<ng-container *ngIf="contacts[contactType] && (contacts[contactType].length > 0 || contactType === searchType)">
|
<ng-container *ngIf="contacts[contactType] && (contacts[contactType].length > 0 || contactType === searchType)">
|
||||||
<ion-item-divider>
|
<ion-item-divider>
|
||||||
<ion-label><p class="item-heading">{{ 'addon.messages.type_' + contactType | translate }}</p></ion-label>
|
<ion-label>
|
||||||
<ion-note slot="end" class="ion-padding-end"><ion-badge>{{ contacts[contactType].length }}</ion-badge></ion-note>
|
<p class="item-heading">{{ 'addon.messages.type_' + contactType | translate }}</p>
|
||||||
|
</ion-label>
|
||||||
|
<ion-note slot="end" class="ion-padding-end">
|
||||||
|
<ion-badge>{{ contacts[contactType].length }}</ion-badge>
|
||||||
|
</ion-note>
|
||||||
</ion-item-divider>
|
</ion-item-divider>
|
||||||
<ng-container *ngFor="let contact of contacts[contactType]">
|
<ng-container *ngFor="let contact of contacts[contactType]">
|
||||||
<!-- Don't show deleted users -->
|
<!-- Don't show deleted users -->
|
||||||
<ion-item class="ion-text-wrap addon-messages-conversation-item"
|
<ion-item class="ion-text-wrap addon-messages-conversation-item"
|
||||||
*ngIf="contact.profileimageurl || contact.profileimageurlsmall"
|
*ngIf="contact.profileimageurl || contact.profileimageurlsmall" [attr.aria-label]="contact.fullname"
|
||||||
[attr.aria-label]="contact.fullname" (click)="gotoDiscussion(contact.id)" detail="true" button
|
(click)="gotoDiscussion(contact.id)" detail="true" button
|
||||||
[attr.aria-current]="contact.id == discussionUserId ? 'page' : 'false'">
|
[attr.aria-current]="contact.id == discussionUserId ? 'page' : 'false'">
|
||||||
<core-user-avatar [user]="contact" slot="start" [checkOnline]="contact.showonlinestatus"></core-user-avatar>
|
<core-user-avatar [user]="contact" slot="start" [checkOnline]="contact.showonlinestatus"></core-user-avatar>
|
||||||
<ion-label><p class="item-heading">{{ contact.fullname }}</p></ion-label>
|
<ion-label>
|
||||||
|
<p class="item-heading">{{ contact.fullname }}</p>
|
||||||
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
|
@ -3,7 +3,9 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>{{ 'addon.messages.contacts' | translate }}</h1>
|
<h1>{{ 'addon.messages.contacts' | translate }}</h1>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button fill="clear" (click)="gotoSearch()" [attr.aria-label]="'addon.messages.searchcombined' | translate">
|
<ion-button fill="clear" (click)="gotoSearch()" [attr.aria-label]="'addon.messages.searchcombined' | translate">
|
||||||
<ion-icon name="fas-search" slot="icon-only" aria-hidden="true"></ion-icon>
|
<ion-icon name="fas-search" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
|
@ -26,8 +28,8 @@
|
||||||
<ion-item class="ion-text-wrap addon-messages-conversation-item" (click)="selectUser(contact.id)" button
|
<ion-item class="ion-text-wrap addon-messages-conversation-item" (click)="selectUser(contact.id)" button
|
||||||
*ngFor="let contact of confirmedContacts" [attr.aria-label]="contact.fullname" detail="true"
|
*ngFor="let contact of confirmedContacts" [attr.aria-label]="contact.fullname" detail="true"
|
||||||
[attr.aria-current]="contact.id == selectedUserId ? 'page' : 'false'">
|
[attr.aria-current]="contact.id == selectedUserId ? 'page' : 'false'">
|
||||||
<core-user-avatar slot="start" [user]="contact"
|
<core-user-avatar slot="start" [user]="contact" [checkOnline]="contact.showonlinestatus"
|
||||||
[checkOnline]="contact.showonlinestatus" [linkProfile]="false">
|
[linkProfile]="false">
|
||||||
</core-user-avatar>
|
</core-user-avatar>
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<p class="item-heading">
|
<p class="item-heading">
|
||||||
|
@ -45,8 +47,8 @@
|
||||||
[message]="'addon.messages.nocontactsgetstarted' | translate">
|
[message]="'addon.messages.nocontactsgetstarted' | translate">
|
||||||
</core-empty-box>
|
</core-empty-box>
|
||||||
|
|
||||||
<core-infinite-loading [enabled]="confirmedCanLoadMore" (action)="loadMore($event)"
|
<core-infinite-loading [enabled]="confirmedCanLoadMore" (action)="loadMore($event)" [error]="confirmedLoadMoreError"
|
||||||
[error]="confirmedLoadMoreError" position="bottom">
|
position="bottom">
|
||||||
</core-infinite-loading>
|
</core-infinite-loading>
|
||||||
</core-loading>
|
</core-loading>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
|
@ -77,8 +79,8 @@
|
||||||
<core-empty-box *ngIf="!requests.length" icon="far-address-book"
|
<core-empty-box *ngIf="!requests.length" icon="far-address-book"
|
||||||
[message]="'addon.messages.nocontactrequests' | translate">
|
[message]="'addon.messages.nocontactrequests' | translate">
|
||||||
</core-empty-box>
|
</core-empty-box>
|
||||||
<core-infinite-loading [enabled]="requestsCanLoadMore" (action)="loadMore($event)"
|
<core-infinite-loading [enabled]="requestsCanLoadMore" (action)="loadMore($event)" [error]="requestsLoadMoreError"
|
||||||
[error]="requestsLoadMoreError" position="bottom">
|
position="bottom">
|
||||||
</core-infinite-loading>
|
</core-infinite-loading>
|
||||||
</core-loading>
|
</core-loading>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
|
|
|
@ -3,12 +3,12 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>
|
<h1>
|
||||||
<img *ngIf="loaded && !otherMember && conversationImage" class="core-bar-button-image" [src]="conversationImage"
|
<img *ngIf="loaded && !otherMember && conversationImage" class="core-bar-button-image" [src]="conversationImage" alt=""
|
||||||
alt="" onError="this.src='assets/img/group-avatar.png'" core-external-content role="presentation"
|
onError="this.src='assets/img/group-avatar.png'" core-external-content role="presentation" [siteId]="siteId || null">
|
||||||
[siteId]="siteId || null">
|
<core-user-avatar *ngIf="loaded && otherMember" class="core-bar-button-image" [user]="otherMember" [linkProfile]="false"
|
||||||
<core-user-avatar *ngIf="loaded && otherMember" class="core-bar-button-image" [user]="otherMember"
|
[checkOnline]="otherMember.showonlinestatus">
|
||||||
[linkProfile]="false" [checkOnline]="otherMember.showonlinestatus">
|
|
||||||
</core-user-avatar>
|
</core-user-avatar>
|
||||||
<core-format-text [text]="title" contextLevel="system" [contextInstanceId]="0"></core-format-text>
|
<core-format-text [text]="title" contextLevel="system" [contextInstanceId]="0"></core-format-text>
|
||||||
<ion-icon *ngIf="conversation && conversation.isfavourite" name="fas-star"
|
<ion-icon *ngIf="conversation && conversation.isfavourite" name="fas-star"
|
||||||
|
@ -18,44 +18,41 @@
|
||||||
[attr.aria-label]="'addon.messages.mutedconversation' | translate">
|
[attr.aria-label]="'addon.messages.mutedconversation' | translate">
|
||||||
</ion-icon>
|
</ion-icon>
|
||||||
</h1>
|
</h1>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end"></ion-buttons>
|
<ion-buttons slot="end"></ion-buttons>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
<core-navbar-buttons slot="end">
|
<core-navbar-buttons slot="end">
|
||||||
<core-context-menu [attr.aria-label]="'addon.messages.conversationactions' | translate">
|
<core-context-menu [attr.aria-label]="'addon.messages.conversationactions' | translate">
|
||||||
<core-context-menu-item [hidden]="isSelf || !showInfo || isGroup" [priority]="1000"
|
<core-context-menu-item [hidden]="isSelf || !showInfo || isGroup" [priority]="1000"
|
||||||
[content]="'addon.messages.info' | translate" (action)="viewInfo()"
|
[content]="'addon.messages.info' | translate" (action)="viewInfo()" iconAction="fas-info-circle"></core-context-menu-item>
|
||||||
iconAction="fas-info-circle"></core-context-menu-item>
|
|
||||||
<core-context-menu-item [hidden]="isSelf || !showInfo || !isGroup" [priority]="1000"
|
<core-context-menu-item [hidden]="isSelf || !showInfo || !isGroup" [priority]="1000"
|
||||||
[content]="'addon.messages.groupinfo' | translate" (action)="viewInfo()"
|
[content]="'addon.messages.groupinfo' | translate" (action)="viewInfo()" iconAction="fas-info-circle">
|
||||||
iconAction="fas-info-circle"></core-context-menu-item>
|
</core-context-menu-item>
|
||||||
<core-context-menu-item [hidden]="!groupMessagingEnabled || !conversation" [priority]="800"
|
<core-context-menu-item [hidden]="!groupMessagingEnabled || !conversation" [priority]="800" [content]="(conversation && conversation.isfavourite ? 'addon.messages.removefromfavourites' :
|
||||||
[content]="(conversation && conversation.isfavourite ? 'addon.messages.removefromfavourites' :
|
'addon.messages.addtofavourites') | translate" (action)="changeFavourite($event)" [closeOnClick]="false"
|
||||||
'addon.messages.addtofavourites') | translate"
|
[iconAction]="favouriteIcon" [iconSlash]="favouriteIconSlash"></core-context-menu-item>
|
||||||
(action)="changeFavourite($event)" [closeOnClick]="false" [iconAction]="favouriteIcon"
|
|
||||||
[iconSlash]="favouriteIconSlash"></core-context-menu-item>
|
|
||||||
<core-context-menu-item [hidden]="isSelf || !otherMember || otherMember.isblocked" [priority]="700"
|
<core-context-menu-item [hidden]="isSelf || !otherMember || otherMember.isblocked" [priority]="700"
|
||||||
[content]="'addon.messages.blockuser' | translate" (action)="blockUser()" [iconAction]="blockIcon">
|
[content]="'addon.messages.blockuser' | translate" (action)="blockUser()" [iconAction]="blockIcon">
|
||||||
</core-context-menu-item>
|
</core-context-menu-item>
|
||||||
<core-context-menu-item [hidden]="isSelf || !otherMember || !otherMember.isblocked" [priority]="700"
|
<core-context-menu-item [hidden]="isSelf || !otherMember || !otherMember.isblocked" [priority]="700"
|
||||||
[content]="'addon.messages.unblockuser' | translate" (action)="unblockUser()" [iconAction]="blockIcon">
|
[content]="'addon.messages.unblockuser' | translate" (action)="unblockUser()" [iconAction]="blockIcon">
|
||||||
</core-context-menu-item>
|
</core-context-menu-item>
|
||||||
<core-context-menu-item [hidden]="isSelf || !muteEnabled || !conversation" [priority]="600"
|
<core-context-menu-item [hidden]="isSelf || !muteEnabled || !conversation" [priority]="600" [content]="(conversation && conversation.ismuted ? 'addon.messages.unmuteconversation' :
|
||||||
[content]="(conversation && conversation.ismuted ? 'addon.messages.unmuteconversation' :
|
|
||||||
'addon.messages.muteconversation') | translate" (action)="changeMute($event)" [closeOnClick]="false"
|
'addon.messages.muteconversation') | translate" (action)="changeMute($event)" [closeOnClick]="false"
|
||||||
[iconAction]="muteIcon"></core-context-menu-item>
|
[iconAction]="muteIcon"></core-context-menu-item>
|
||||||
<core-context-menu-item [hidden]="!canDelete || !messages || !messages.length" [priority]="400"
|
<core-context-menu-item [hidden]="!canDelete || !messages || !messages.length" [priority]="400"
|
||||||
[content]="'addon.messages.showdeletemessages' | translate"
|
[content]="'addon.messages.showdeletemessages' | translate" iconAction="toggle" [(toggle)]="showDelete">
|
||||||
iconAction="toggle" [(toggle)]="showDelete"></core-context-menu-item>
|
</core-context-menu-item>
|
||||||
<core-context-menu-item [hidden]="!groupMessagingEnabled || !conversationId || isGroup || !messages || !messages.length"
|
<core-context-menu-item [hidden]="!groupMessagingEnabled || !conversationId || isGroup || !messages || !messages.length"
|
||||||
[priority]="200" [content]="'addon.messages.deleteconversation' | translate" (action)="deleteConversation($event)"
|
[priority]="200" [content]="'addon.messages.deleteconversation' | translate" (action)="deleteConversation($event)"
|
||||||
[closeOnClick]="false" [iconAction]="deleteIcon"></core-context-menu-item>
|
[closeOnClick]="false" [iconAction]="deleteIcon"></core-context-menu-item>
|
||||||
<core-context-menu-item
|
<core-context-menu-item
|
||||||
[hidden]="isSelf || !otherMember || otherMember.iscontact || requestContactSent || requestContactReceived"
|
[hidden]="isSelf || !otherMember || otherMember.iscontact || requestContactSent || requestContactReceived" [priority]="100"
|
||||||
[priority]="100" [content]="'addon.messages.addtoyourcontacts' | translate" (action)="createContactRequest()"
|
[content]="'addon.messages.addtoyourcontacts' | translate" (action)="createContactRequest()" [iconAction]="addRemoveIcon">
|
||||||
[iconAction]="addRemoveIcon"></core-context-menu-item>
|
</core-context-menu-item>
|
||||||
<core-context-menu-item [hidden]="isSelf || !otherMember || !otherMember.iscontact" [priority]="100"
|
<core-context-menu-item [hidden]="isSelf || !otherMember || !otherMember.iscontact" [priority]="100"
|
||||||
[content]="'addon.messages.removefromyourcontacts' | translate" (action)="removeContact()"
|
[content]="'addon.messages.removefromyourcontacts' | translate" (action)="removeContact()" [iconAction]="addRemoveIcon"
|
||||||
[iconAction]="addRemoveIcon" [iconSlash]="true"></core-context-menu-item>
|
[iconSlash]="true"></core-context-menu-item>
|
||||||
</core-context-menu>
|
</core-context-menu>
|
||||||
</core-navbar-buttons>
|
</core-navbar-buttons>
|
||||||
</ion-header>
|
</ion-header>
|
||||||
|
@ -72,15 +69,13 @@
|
||||||
|
|
||||||
<h2 class="sr-only">{{ title }}</h2>
|
<h2 class="sr-only">{{ title }}</h2>
|
||||||
|
|
||||||
<ion-list class="addon-messages-discussion-container" [class.addon-messages-discussion-group]="isGroup"
|
<ion-list class="addon-messages-discussion-container" [class.addon-messages-discussion-group]="isGroup" [attr.aria-live]="'polite'">
|
||||||
[attr.aria-live]="'polite'">
|
|
||||||
<ng-container *ngFor="let message of messages; index as index; last as last">
|
<ng-container *ngFor="let message of messages; index as index; last as last">
|
||||||
<h3 class="ion-text-center addon-messages-date" *ngIf="message.showDate">
|
<h3 class="ion-text-center addon-messages-date" *ngIf="message.showDate">
|
||||||
{{ message.timecreated | coreFormatDate: "strftimedayshort" }}
|
{{ message.timecreated | coreFormatDate: "strftimedayshort" }}
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ion-chip class="addon-messages-unreadfrom" *ngIf="unreadMessageFrom && message.id == unreadMessageFrom"
|
<ion-chip class="addon-messages-unreadfrom" *ngIf="unreadMessageFrom && message.id == unreadMessageFrom" color="light">
|
||||||
color="light">
|
|
||||||
<ion-label>{{ 'addon.messages.newmessages' | translate }}</ion-label>
|
<ion-label>{{ 'addon.messages.newmessages' | translate }}</ion-label>
|
||||||
<ion-icon name="fas-arrow-down" aria-hidden="true"></ion-icon>
|
<ion-icon name="fas-arrow-down" aria-hidden="true"></ion-icon>
|
||||||
</ion-chip>
|
</ion-chip>
|
||||||
|
@ -93,8 +88,7 @@
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<!-- User data. -->
|
<!-- User data. -->
|
||||||
<div *ngIf="message.showUserData" class="item-heading addon-message-user">
|
<div *ngIf="message.showUserData" class="item-heading addon-message-user">
|
||||||
<core-user-avatar slot="start" [user]="members[message.useridfrom]" [linkProfile]="false"
|
<core-user-avatar slot="start" [user]="members[message.useridfrom]" [linkProfile]="false" aria-hidden="true">
|
||||||
aria-hidden="true">
|
|
||||||
</core-user-avatar>
|
</core-user-avatar>
|
||||||
<div>{{ members[message.useridfrom].fullname }}</div>
|
<div>{{ members[message.useridfrom].fullname }}</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -3,7 +3,9 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>{{ 'addon.messages.messages' | translate }}</h1>
|
<h1>{{ 'addon.messages.messages' | translate }}</h1>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<core-user-menu-button></core-user-menu-button>
|
<core-user-menu-button></core-user-menu-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
@ -15,9 +17,9 @@
|
||||||
<ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content>
|
<ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content>
|
||||||
</ion-refresher>
|
</ion-refresher>
|
||||||
|
|
||||||
<core-search-box (onSubmit)="searchMessage($event)" (onClear)="clearSearch()"
|
<core-search-box (onSubmit)="searchMessage($event)" (onClear)="clearSearch()" [placeholder]=" 'addon.messages.message' | translate"
|
||||||
[placeholder]=" 'addon.messages.message' | translate" autocorrect="off" spellcheck="false" lengthCheck="2"
|
autocorrect="off" spellcheck="false" lengthCheck="2" [disabled]="!loaded" searchArea="AddonMessagesDiscussions"
|
||||||
[disabled]="!loaded" searchArea="AddonMessagesDiscussions" [autoFocus]="false"></core-search-box>
|
[autoFocus]="false"></core-search-box>
|
||||||
|
|
||||||
<core-loading [hideUntil]="loaded" [message]="loadingMessage">
|
<core-loading [hideUntil]="loaded" [message]="loadingMessage">
|
||||||
|
|
||||||
|
@ -26,7 +28,9 @@
|
||||||
<ion-item class="ion-text-wrap addon-message-discussion" (click)="gotoContacts()"
|
<ion-item class="ion-text-wrap addon-message-discussion" (click)="gotoContacts()"
|
||||||
[attr.aria-label]="'addon.messages.contacts' | translate" detail="true" button>
|
[attr.aria-label]="'addon.messages.contacts' | translate" detail="true" button>
|
||||||
<ion-icon name="fas-address-book" slot="start" aria-hidden="true"></ion-icon>
|
<ion-icon name="fas-address-book" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label><h2>{{ 'addon.messages.contacts' | translate }}</h2></ion-label>
|
<ion-label>
|
||||||
|
<h2>{{ 'addon.messages.contacts' | translate }}</h2>
|
||||||
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
|
||||||
<ng-container *ngIf="search.showResults">
|
<ng-container *ngIf="search.showResults">
|
||||||
|
@ -34,7 +38,9 @@
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<h2>{{ 'core.searchresults' | translate }}</h2>
|
<h2>{{ 'core.searchresults' | translate }}</h2>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
<ion-note slot="end" class="ion-padding-end"><ion-badge>{{ search.results.length }}</ion-badge></ion-note>
|
<ion-note slot="end" class="ion-padding-end">
|
||||||
|
<ion-badge>{{ search.results.length }}</ion-badge>
|
||||||
|
</ion-note>
|
||||||
</ion-item-divider>
|
</ion-item-divider>
|
||||||
<ion-item class="ion-text-wrap addon-message-discussion" *ngFor="let result of search.results" button
|
<ion-item class="ion-text-wrap addon-message-discussion" *ngFor="let result of search.results" button
|
||||||
[attr.aria-label]="result.fullname" (click)="gotoDiscussion(result.userid, result.messageid)"
|
[attr.aria-label]="result.fullname" (click)="gotoDiscussion(result.userid, result.messageid)"
|
||||||
|
@ -42,8 +48,10 @@
|
||||||
<core-user-avatar [user]="result" slot="start" [checkOnline]="result.showonlinestatus"></core-user-avatar>
|
<core-user-avatar [user]="result" slot="start" [checkOnline]="result.showonlinestatus"></core-user-avatar>
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<p class="item-heading">{{ result.fullname }}</p>
|
<p class="item-heading">{{ result.fullname }}</p>
|
||||||
<p><core-format-text clean="true" singleLine="true" [text]="result.lastmessage" contextLevel="system"
|
<p>
|
||||||
[contextInstanceId]="0"></core-format-text></p>
|
<core-format-text clean="true" singleLine="true" [text]="result.lastmessage" contextLevel="system"
|
||||||
|
[contextInstanceId]="0"></core-format-text>
|
||||||
|
</p>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
@ -67,8 +75,8 @@
|
||||||
</ion-note>
|
</ion-note>
|
||||||
</div>
|
</div>
|
||||||
<p>
|
<p>
|
||||||
<core-format-text clean="true" singleLine="true" [text]="discussion.message!.message"
|
<core-format-text clean="true" singleLine="true" [text]="discussion.message!.message" contextLevel="system"
|
||||||
contextLevel="system" [contextInstanceId]="0">
|
[contextInstanceId]="0">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</p>
|
</p>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
|
|
|
@ -3,7 +3,9 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>{{ 'addon.messages.messages' | translate }}</h1>
|
<h1>{{ 'addon.messages.messages' | translate }}</h1>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button fill="clear" (click)="gotoSearch()" [attr.aria-label]="'addon.messages.searchcombined' | translate">
|
<ion-button fill="clear" (click)="gotoSearch()" [attr.aria-label]="'addon.messages.searchcombined' | translate">
|
||||||
<ion-icon name="fas-search" slot="icon-only" aria-hidden="true"></ion-icon>
|
<ion-icon name="fas-search" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
|
@ -25,28 +27,25 @@
|
||||||
<ion-list>
|
<ion-list>
|
||||||
<ion-item class="ion-text-wrap addon-message-discussion" (click)="gotoContacts()" detail="true" button>
|
<ion-item class="ion-text-wrap addon-message-discussion" (click)="gotoContacts()" detail="true" button>
|
||||||
<ion-icon name="fas-address-book" slot="start" aria-hidden="true"></ion-icon>
|
<ion-icon name="fas-address-book" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label><h2>{{ 'addon.messages.contacts' | translate }}</h2></ion-label>
|
<ion-label>
|
||||||
|
<h2>{{ 'addon.messages.contacts' | translate }}</h2>
|
||||||
|
</ion-label>
|
||||||
<ion-badge *ngIf="contactRequestsCount > 0" slot="end" aria-hidden="true">{{contactRequestsCount}}</ion-badge>
|
<ion-badge *ngIf="contactRequestsCount > 0" slot="end" aria-hidden="true">{{contactRequestsCount}}</ion-badge>
|
||||||
<span *ngIf="contactRequestsCount > 0" class="sr-only">
|
<span *ngIf="contactRequestsCount > 0" class="sr-only">
|
||||||
{{ 'addon.messages.pendingcontactrequests' | translate:{$a: contactRequestsCount} }}
|
{{ 'addon.messages.pendingcontactrequests' | translate:{$a: contactRequestsCount} }}
|
||||||
</span>
|
</span>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<!-- Favourite conversations. -->
|
<!-- Favourite conversations. -->
|
||||||
<ion-item
|
<ion-item button class="ion-text-wrap divider" (click)="toggle(favourites)" sticky="true"
|
||||||
button
|
|
||||||
class="ion-text-wrap divider"
|
|
||||||
(click)="toggle(favourites)"
|
|
||||||
sticky="true"
|
|
||||||
[attr.aria-label]="(favourites.expanded ? 'core.collapse' : 'core.expand') | translate"
|
[attr.aria-label]="(favourites.expanded ? 'core.collapse' : 'core.expand') | translate"
|
||||||
[attr.aria-expanded]="favourites.expanded"
|
[attr.aria-expanded]="favourites.expanded" aria-controls="addon-messages-groupconversations-favourite" role="heading"
|
||||||
aria-controls="addon-messages-groupconversations-favourite"
|
detail="false">
|
||||||
role="heading"
|
|
||||||
detail="false"
|
|
||||||
>
|
|
||||||
<ion-icon *ngIf="!favourites.expanded" name="fas-caret-right" flip-rtl slot="start" aria-hidden="true">
|
<ion-icon *ngIf="!favourites.expanded" name="fas-caret-right" flip-rtl slot="start" aria-hidden="true">
|
||||||
</ion-icon>
|
</ion-icon>
|
||||||
<ion-icon *ngIf="favourites.expanded" name="fas-caret-down" slot="start" aria-hidden="true"></ion-icon>
|
<ion-icon *ngIf="favourites.expanded" name="fas-caret-down" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label><h2>{{ 'core.favourites' | translate }} ({{ favourites.count }})</h2></ion-label>
|
<ion-label>
|
||||||
|
<h2>{{ 'core.favourites' | translate }} ({{ favourites.count }})</h2>
|
||||||
|
</ion-label>
|
||||||
<ion-badge slot="end" *ngIf="favourites.unread" aria-hidden="true">{{ favourites.unread }}</ion-badge>
|
<ion-badge slot="end" *ngIf="favourites.unread" aria-hidden="true">{{ favourites.unread }}</ion-badge>
|
||||||
<span *ngIf="favourites.unread" class="sr-only">
|
<span *ngIf="favourites.unread" class="sr-only">
|
||||||
{{ 'addon.messages.unreadconversations' | translate:{$a: favourites.unread} }}
|
{{ 'addon.messages.unreadconversations' | translate:{$a: favourites.unread} }}
|
||||||
|
@ -60,28 +59,26 @@
|
||||||
<core-infinite-loading [enabled]="favourites.canLoadMore" (action)="loadMoreConversations(favourites, $event)"
|
<core-infinite-loading [enabled]="favourites.canLoadMore" (action)="loadMoreConversations(favourites, $event)"
|
||||||
[error]="favourites.loadMoreError"></core-infinite-loading>
|
[error]="favourites.loadMoreError"></core-infinite-loading>
|
||||||
<ion-item class="ion-text-wrap" *ngIf="favourites.conversations && favourites.conversations.length == 0">
|
<ion-item class="ion-text-wrap" *ngIf="favourites.conversations && favourites.conversations.length == 0">
|
||||||
<ion-label><p>{{ 'addon.messages.nofavourites' | translate }}</p></ion-label>
|
<ion-label>
|
||||||
|
<p>{{ 'addon.messages.nofavourites' | translate }}</p>
|
||||||
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</div>
|
</div>
|
||||||
<ion-item class="ion-text-center" *ngIf="favourites.loading">
|
<ion-item class="ion-text-center" *ngIf="favourites.loading">
|
||||||
<ion-label><ion-spinner [attr.aria-label]="'core.loading' | translate"></ion-spinner></ion-label>
|
<ion-label>
|
||||||
|
<ion-spinner [attr.aria-label]="'core.loading' | translate"></ion-spinner>
|
||||||
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
|
||||||
<!-- Group conversations. -->
|
<!-- Group conversations. -->
|
||||||
<ion-item
|
<ion-item button class="divider ion-text-wrap" (click)="toggle(group)" sticky="true"
|
||||||
button
|
[attr.aria-label]="(group.expanded ? 'core.collapse' : 'core.expand') | translate" [attr.aria-expanded]="group.expanded"
|
||||||
class="divider ion-text-wrap"
|
aria-controls="addon-messages-groupconversations-group" role="heading" detail="false">
|
||||||
(click)="toggle(group)"
|
|
||||||
sticky="true"
|
|
||||||
[attr.aria-label]="(group.expanded ? 'core.collapse' : 'core.expand') | translate"
|
|
||||||
[attr.aria-expanded]="group.expanded"
|
|
||||||
aria-controls="addon-messages-groupconversations-group"
|
|
||||||
role="heading"
|
|
||||||
detail="false"
|
|
||||||
>
|
|
||||||
<ion-icon *ngIf="!group.expanded" name="fas-caret-right" flip-rtl slot="start" aria-hidden="true"></ion-icon>
|
<ion-icon *ngIf="!group.expanded" name="fas-caret-right" flip-rtl slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-icon *ngIf="group.expanded" name="fas-caret-down" slot="start" aria-hidden="true"></ion-icon>
|
<ion-icon *ngIf="group.expanded" name="fas-caret-down" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label><h2>{{ 'addon.messages.groupconversations' | translate }} ({{ group.count }})</h2></ion-label>
|
<ion-label>
|
||||||
|
<h2>{{ 'addon.messages.groupconversations' | translate }} ({{ group.count }})</h2>
|
||||||
|
</ion-label>
|
||||||
<ion-badge slot="end" *ngIf="group.unread" aria-hidden="true">{{ group.unread }}</ion-badge>
|
<ion-badge slot="end" *ngIf="group.unread" aria-hidden="true">{{ group.unread }}</ion-badge>
|
||||||
<span *ngIf="group.unread" class="sr-only">
|
<span *ngIf="group.unread" class="sr-only">
|
||||||
{{ 'addon.messages.unreadconversations' | translate:{$a: group.unread} }}
|
{{ 'addon.messages.unreadconversations' | translate:{$a: group.unread} }}
|
||||||
|
@ -95,24 +92,21 @@
|
||||||
<core-infinite-loading [enabled]="group.canLoadMore" (action)="loadMoreConversations(group, $event)"
|
<core-infinite-loading [enabled]="group.canLoadMore" (action)="loadMoreConversations(group, $event)"
|
||||||
[error]="group.loadMoreError"></core-infinite-loading>
|
[error]="group.loadMoreError"></core-infinite-loading>
|
||||||
<ion-item class="ion-text-wrap" *ngIf="group.conversations && group.conversations.length == 0">
|
<ion-item class="ion-text-wrap" *ngIf="group.conversations && group.conversations.length == 0">
|
||||||
<ion-label><p>{{ 'addon.messages.nogroupconversations' | translate }}</p></ion-label>
|
<ion-label>
|
||||||
|
<p>{{ 'addon.messages.nogroupconversations' | translate }}</p>
|
||||||
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</div>
|
</div>
|
||||||
<ion-item class="ion-text-center" *ngIf="group.loading">
|
<ion-item class="ion-text-center" *ngIf="group.loading">
|
||||||
<ion-label><ion-spinner [attr.aria-label]="'core.loading' | translate"></ion-spinner></ion-label>
|
<ion-label>
|
||||||
|
<ion-spinner [attr.aria-label]="'core.loading' | translate"></ion-spinner>
|
||||||
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
|
||||||
<ion-item
|
<ion-item button class="divider ion-text-wrap" (click)="toggle(individual)" sticky="true"
|
||||||
button
|
|
||||||
class="divider ion-text-wrap"
|
|
||||||
(click)="toggle(individual)"
|
|
||||||
sticky="true"
|
|
||||||
[attr.aria-label]="(individual.expanded ? 'core.collapse' : 'core.expand') | translate"
|
[attr.aria-label]="(individual.expanded ? 'core.collapse' : 'core.expand') | translate"
|
||||||
[attr.aria-expanded]="individual.expanded"
|
[attr.aria-expanded]="individual.expanded" aria-controls="addon-messages-groupconversations-individual" role="heading"
|
||||||
aria-controls="addon-messages-groupconversations-individual"
|
detail="false">
|
||||||
role="heading"
|
|
||||||
detail="false"
|
|
||||||
>
|
|
||||||
<ion-icon *ngIf="!individual.expanded" name="fas-caret-right" flip-rtl slot="start" aria-hidden="true">
|
<ion-icon *ngIf="!individual.expanded" name="fas-caret-right" flip-rtl slot="start" aria-hidden="true">
|
||||||
</ion-icon>
|
</ion-icon>
|
||||||
<ion-icon *ngIf="individual.expanded" name="fas-caret-down" slot="start" aria-hidden="true"></ion-icon>
|
<ion-icon *ngIf="individual.expanded" name="fas-caret-down" slot="start" aria-hidden="true"></ion-icon>
|
||||||
|
@ -132,11 +126,15 @@
|
||||||
<core-infinite-loading [enabled]="individual.canLoadMore" (action)="loadMoreConversations(individual, $event)"
|
<core-infinite-loading [enabled]="individual.canLoadMore" (action)="loadMoreConversations(individual, $event)"
|
||||||
[error]="individual.loadMoreError"></core-infinite-loading>
|
[error]="individual.loadMoreError"></core-infinite-loading>
|
||||||
<ion-item class="ion-text-wrap" *ngIf="individual.conversations && individual.conversations.length == 0">
|
<ion-item class="ion-text-wrap" *ngIf="individual.conversations && individual.conversations.length == 0">
|
||||||
<ion-label><p>{{ 'addon.messages.noindividualconversations' | translate }}</p></ion-label>
|
<ion-label>
|
||||||
|
<p>{{ 'addon.messages.noindividualconversations' | translate }}</p>
|
||||||
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</div>
|
</div>
|
||||||
<ion-item class="ion-text-center" *ngIf="individual.loading">
|
<ion-item class="ion-text-center" *ngIf="individual.loading">
|
||||||
<ion-label><ion-spinner [attr.aria-label]="'core.loading' | translate"></ion-spinner></ion-label>
|
<ion-label>
|
||||||
|
<ion-spinner [attr.aria-label]="'core.loading' | translate"></ion-spinner>
|
||||||
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
|
||||||
</ion-list>
|
</ion-list>
|
||||||
|
@ -147,8 +145,7 @@
|
||||||
<!-- Template to render a list of conversations. -->
|
<!-- Template to render a list of conversations. -->
|
||||||
<ng-template #conversationsTemplate let-conversations="conversations">
|
<ng-template #conversationsTemplate let-conversations="conversations">
|
||||||
<ion-item class="ion-text-wrap addon-message-discussion" *ngFor="let conversation of conversations" button detail="false"
|
<ion-item class="ion-text-wrap addon-message-discussion" *ngFor="let conversation of conversations" button detail="false"
|
||||||
[attr.aria-label]="conversation.name" (click)="gotoConversation(conversation.id, conversation.userid)"
|
[attr.aria-label]="conversation.name" (click)="gotoConversation(conversation.id, conversation.userid)" [attr.aria-current]="((conversation.id && conversation.id == selectedConversationId) ||
|
||||||
[attr.aria-current]="((conversation.id && conversation.id == selectedConversationId) ||
|
|
||||||
(conversation.userid && conversation.userid == selectedUserId)) ? 'page': 'false'"
|
(conversation.userid && conversation.userid == selectedUserId)) ? 'page': 'false'"
|
||||||
id="addon-message-conversation-{{ conversation.id ? conversation.id : 'user-' + conversation.userid }}">
|
id="addon-message-conversation-{{ conversation.id ? conversation.id : 'user-' + conversation.userid }}">
|
||||||
<!-- Group conversation image. -->
|
<!-- Group conversation image. -->
|
||||||
|
@ -158,17 +155,17 @@
|
||||||
</ion-avatar>
|
</ion-avatar>
|
||||||
|
|
||||||
<!-- Avatar for individual conversations. -->
|
<!-- Avatar for individual conversations. -->
|
||||||
<core-user-avatar *ngIf="conversation.type != typeGroup" core-user-avatar [user]="conversation.otherUser"
|
<core-user-avatar *ngIf="conversation.type != typeGroup" core-user-avatar [user]="conversation.otherUser" [linkProfile]="false"
|
||||||
[linkProfile]="false" [checkOnline]="conversation.showonlinestatus" slot="start"></core-user-avatar>
|
[checkOnline]="conversation.showonlinestatus" slot="start"></core-user-avatar>
|
||||||
|
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<div class="flex-row ion-justify-content-between">
|
<div class="flex-row ion-justify-content-between">
|
||||||
<p class="item-heading">
|
<p class="item-heading">
|
||||||
<core-format-text [text]="conversation.name" contextLevel="system" [contextInstanceId]="0"></core-format-text>
|
<core-format-text [text]="conversation.name" contextLevel="system" [contextInstanceId]="0"></core-format-text>
|
||||||
<ion-icon name="fas-user-slash" *ngIf="conversation.isblocked"
|
<ion-icon name="fas-user-slash" *ngIf="conversation.isblocked" [title]="'addon.messages.contactblocked' | translate">
|
||||||
[title]="'addon.messages.contactblocked' | translate"></ion-icon>
|
</ion-icon>
|
||||||
<ion-icon *ngIf="conversation.ismuted" name="fas-volume-mute"
|
<ion-icon *ngIf="conversation.ismuted" name="fas-volume-mute" [title]="'addon.messages.mutedconversation' | translate">
|
||||||
[title]="'addon.messages.mutedconversation' | translate"></ion-icon>
|
</ion-icon>
|
||||||
</p>
|
</p>
|
||||||
<ion-note *ngIf="conversation.lastmessagedate > 0 || conversation.unreadcount">
|
<ion-note *ngIf="conversation.lastmessagedate > 0 || conversation.unreadcount">
|
||||||
<span *ngIf="conversation.lastmessagedate > 0" class="addon-message-last-message-date">
|
<span *ngIf="conversation.lastmessagedate > 0" class="addon-message-last-message-date">
|
||||||
|
@ -180,16 +177,17 @@
|
||||||
</span>
|
</span>
|
||||||
</ion-note>
|
</ion-note>
|
||||||
</div>
|
</div>
|
||||||
<p *ngIf="conversation.subname"><core-format-text [text]="conversation.subname" contextLevel="system"
|
<p *ngIf="conversation.subname">
|
||||||
[contextInstanceId]="0"></core-format-text></p>
|
<core-format-text [text]="conversation.subname" contextLevel="system" [contextInstanceId]="0"></core-format-text>
|
||||||
|
</p>
|
||||||
<p class="addon-message-last-message">
|
<p class="addon-message-last-message">
|
||||||
<span *ngIf="conversation.sentfromcurrentuser" class="addon-message-last-message-user">
|
<span *ngIf="conversation.sentfromcurrentuser" class="addon-message-last-message-user">
|
||||||
{{ 'addon.messages.you' | translate }}
|
{{ 'addon.messages.you' | translate }}
|
||||||
</span>
|
</span>
|
||||||
<span *ngIf="!conversation.sentfromcurrentuser && conversation.type == typeGroup && conversation.members[0]"
|
<span *ngIf="!conversation.sentfromcurrentuser && conversation.type == typeGroup && conversation.members[0]"
|
||||||
class="addon-message-last-message-user">{{ conversation.members[0].fullname + ':' }}</span>
|
class="addon-message-last-message-user">{{ conversation.members[0].fullname + ':' }}</span>
|
||||||
<core-format-text clean="true" singleLine="true" [text]="conversation.lastmessage"
|
<core-format-text clean="true" singleLine="true" [text]="conversation.lastmessage" class="addon-message-last-message-text"
|
||||||
class="addon-message-last-message-text" contextLevel="system" [contextInstanceId]="0"></core-format-text>
|
contextLevel="system" [contextInstanceId]="0"></core-format-text>
|
||||||
</p>
|
</p>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
|
|
@ -3,7 +3,9 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>{{ 'addon.messages.searchcombined' | translate }}</h1>
|
<h1>{{ 'addon.messages.searchcombined' | translate }}</h1>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
|
@ -23,8 +25,7 @@
|
||||||
[error]="messages.loadMoreError"></core-infinite-loading>
|
[error]="messages.loadMoreError"></core-infinite-loading>
|
||||||
</ion-list>
|
</ion-list>
|
||||||
|
|
||||||
<core-empty-box
|
<core-empty-box *ngIf="displayResults && !contacts.results.length && !nonContacts.results.length && !messages.results.length"
|
||||||
*ngIf="displayResults && !contacts.results.length && !nonContacts.results.length && !messages.results.length"
|
|
||||||
icon="fas-search" [message]="'core.noresults' | translate">
|
icon="fas-search" [message]="'core.noresults' | translate">
|
||||||
</core-empty-box>
|
</core-empty-box>
|
||||||
</core-loading>
|
</core-loading>
|
||||||
|
@ -35,20 +36,20 @@
|
||||||
<ng-template #resultsTemplate let-item="item">
|
<ng-template #resultsTemplate let-item="item">
|
||||||
<ng-container *ngIf="item.results.length > 0">
|
<ng-container *ngIf="item.results.length > 0">
|
||||||
<ion-item-divider class="ion-text-wrap">
|
<ion-item-divider class="ion-text-wrap">
|
||||||
<ion-label><h2>{{ item.titleString | translate }}</h2></ion-label>
|
<ion-label>
|
||||||
|
<h2>{{ item.titleString | translate }}</h2>
|
||||||
|
</ion-label>
|
||||||
</ion-item-divider>
|
</ion-item-divider>
|
||||||
|
|
||||||
<!-- List of results -->
|
<!-- List of results -->
|
||||||
<ion-item class="addon-message-discussion ion-text-wrap" *ngFor="let result of item.results" [attr.aria-label]="result.fullname"
|
<ion-item class="addon-message-discussion ion-text-wrap" *ngFor="let result of item.results" [attr.aria-label]="result.fullname"
|
||||||
(click)="openConversation(result)" [attr.aria-current]="result == selectedResult ? 'page' : 'false'" detail="true"
|
(click)="openConversation(result)" [attr.aria-current]="result == selectedResult ? 'page' : 'false'" detail="true" button>
|
||||||
button>
|
|
||||||
<core-user-avatar slot="start" [user]="result" [checkOnline]="true" [linkProfile]="false"></core-user-avatar>
|
<core-user-avatar slot="start" [user]="result" [checkOnline]="true" [linkProfile]="false"></core-user-avatar>
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<p class="item-heading">
|
<p class="item-heading">
|
||||||
<core-format-text [text]="result.fullname" [highlight]="result.highlightName" [filter]="false">
|
<core-format-text [text]="result.fullname" [highlight]="result.highlightName" [filter]="false">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
<ion-icon name="fas-ban" *ngIf="result.isblocked"
|
<ion-icon name="fas-ban" *ngIf="result.isblocked" [attr.aria-label]="'addon.messages.contactblocked' | translate">
|
||||||
[attr.aria-label]="'addon.messages.contactblocked' | translate">
|
|
||||||
</ion-icon>
|
</ion-icon>
|
||||||
</p>
|
</p>
|
||||||
<ion-note *ngIf="result.lastmessagedate > 0">
|
<ion-note *ngIf="result.lastmessagedate > 0">
|
||||||
|
@ -58,9 +59,8 @@
|
||||||
<span *ngIf="result.sentfromcurrentuser" class="addon-message-last-message-user">
|
<span *ngIf="result.sentfromcurrentuser" class="addon-message-last-message-user">
|
||||||
{{ 'addon.messages.you' | translate }}
|
{{ 'addon.messages.you' | translate }}
|
||||||
</span>
|
</span>
|
||||||
<core-format-text clean="true" singleLine="true" [text]="result.lastmessage"
|
<core-format-text clean="true" singleLine="true" [text]="result.lastmessage" [highlight]="result.highlightMessage"
|
||||||
[highlight]="result.highlightMessage" contextLevel="system" [contextInstanceId]="0"
|
contextLevel="system" [contextInstanceId]="0" class="addon-message-last-message-text"></core-format-text>
|
||||||
class="addon-message-last-message-text"></core-format-text>
|
|
||||||
</p>
|
</p>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
|
|
@ -3,7 +3,9 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>{{ 'addon.messages.messages' | translate }}</h1>
|
<h1>{{ 'addon.messages.messages' | translate }}</h1>
|
||||||
|
</ion-title>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
</ion-header>
|
</ion-header>
|
||||||
<ion-content>
|
<ion-content>
|
||||||
|
@ -22,7 +24,9 @@
|
||||||
<ion-list *ngIf="advancedContactable" class="ion-text-wrap">
|
<ion-list *ngIf="advancedContactable" class="ion-text-wrap">
|
||||||
<ion-radio-group [(ngModel)]="contactablePrivacy" (ionChange)="saveContactablePrivacy(contactablePrivacy)">
|
<ion-radio-group [(ngModel)]="contactablePrivacy" (ionChange)="saveContactablePrivacy(contactablePrivacy)">
|
||||||
<ion-item-divider>
|
<ion-item-divider>
|
||||||
<ion-label><h2>{{ 'addon.messages.contactableprivacy' | translate }}</h2></ion-label>
|
<ion-label>
|
||||||
|
<h2>{{ 'addon.messages.contactableprivacy' | translate }}</h2>
|
||||||
|
</ion-label>
|
||||||
</ion-item-divider>
|
</ion-item-divider>
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-label>{{ 'addon.messages.contactableprivacy_onlycontacts' | translate }}</ion-label>
|
<ion-label>{{ 'addon.messages.contactableprivacy_onlycontacts' | translate }}</ion-label>
|
||||||
|
@ -66,16 +70,9 @@
|
||||||
<ng-container *ngIf="groupMessagingEnabled">
|
<ng-container *ngIf="groupMessagingEnabled">
|
||||||
<ion-item class="ion-text-wrap">
|
<ion-item class="ion-text-wrap">
|
||||||
<ion-label>{{ processor.displayname }}</ion-label>
|
<ion-label>{{ processor.displayname }}</ion-label>
|
||||||
<core-button-with-spinner
|
<core-button-with-spinner *ngIf="!preferences.disableall" [loading]="!!notification.updating" slot="end">
|
||||||
*ngIf="!preferences.disableall"
|
<ion-toggle *ngIf="!processor.locked" [(ngModel)]="processor.checked"
|
||||||
[loading]="!!notification.updating"
|
(ngModelChange)="changePreference(notification, '', processor)">
|
||||||
slot="end"
|
|
||||||
>
|
|
||||||
<ion-toggle
|
|
||||||
*ngIf="!processor.locked"
|
|
||||||
[(ngModel)]="processor.checked"
|
|
||||||
(ngModelChange)="changePreference(notification, '', processor)"
|
|
||||||
>
|
|
||||||
</ion-toggle>
|
</ion-toggle>
|
||||||
<ion-note *ngIf="processor.locked">
|
<ion-note *ngIf="processor.locked">
|
||||||
{{ processor.lockedmessage }}
|
{{ processor.lockedmessage }}
|
||||||
|
@ -92,15 +89,11 @@
|
||||||
<ion-row class="ion-text-wrap ion-hide-md-down ion-align-items-center">
|
<ion-row class="ion-text-wrap ion-hide-md-down ion-align-items-center">
|
||||||
<ion-col class="ion-margin-horizontal">{{ processor.displayname }}</ion-col>
|
<ion-col class="ion-margin-horizontal">{{ processor.displayname }}</ion-col>
|
||||||
<ion-col size="2" class="ion-text-center" *ngFor="let state of ['loggedin', 'loggedoff']">
|
<ion-col size="2" class="ion-text-center" *ngFor="let state of ['loggedin', 'loggedoff']">
|
||||||
<core-button-with-spinner
|
<core-button-with-spinner *ngIf="!preferences.disableall"
|
||||||
*ngIf="!preferences.disableall"
|
[loading]="notification.updating && notification.updating[state]">
|
||||||
[loading]="notification.updating && notification.updating[state]"
|
|
||||||
>
|
|
||||||
<!-- If notifications not disabled, show toggle. -->
|
<!-- If notifications not disabled, show toggle. -->
|
||||||
<ion-toggle *ngIf="!processor.locked"
|
<ion-toggle *ngIf="!processor.locked" [(ngModel)]="processor[state].checked"
|
||||||
[(ngModel)]="processor[state].checked"
|
(ngModelChange)="changePreference(notification, state, processor)">
|
||||||
(ngModelChange)="changePreference(notification, state, processor)"
|
|
||||||
>
|
|
||||||
</ion-toggle>
|
</ion-toggle>
|
||||||
<div class="ion-padding text-gray" *ngIf="processor.locked">
|
<div class="ion-padding text-gray" *ngIf="processor.locked">
|
||||||
{{'core.settings.locked' | translate }}
|
{{'core.settings.locked' | translate }}
|
||||||
|
@ -118,14 +111,10 @@
|
||||||
If notifications are disabled, show "Disabled" instead of toggle. -->
|
If notifications are disabled, show "Disabled" instead of toggle. -->
|
||||||
<ion-item *ngFor="let state of ['loggedin', 'loggedoff']" class="ion-text-wrap ion-hide-md-up">
|
<ion-item *ngFor="let state of ['loggedin', 'loggedoff']" class="ion-text-wrap ion-hide-md-up">
|
||||||
<ion-label>{{ 'core.settings.' + state | translate }}</ion-label>
|
<ion-label>{{ 'core.settings.' + state | translate }}</ion-label>
|
||||||
<core-button-with-spinner slot="end"
|
<core-button-with-spinner slot="end" *ngIf="!preferences.disableall"
|
||||||
*ngIf="!preferences.disableall"
|
[loading]="notification.updating && notification.updating[state]">
|
||||||
[loading]="notification.updating && notification.updating[state]"
|
<ion-toggle *ngIf="!processor.locked" [(ngModel)]="processor[state].checked"
|
||||||
>
|
(ngModelChange)="changePreference(notification, state, processor)">
|
||||||
<ion-toggle *ngIf="!processor.locked"
|
|
||||||
[(ngModel)]="processor[state].checked"
|
|
||||||
(ngModelChange)="changePreference(notification, state, processor)"
|
|
||||||
>
|
|
||||||
</ion-toggle>
|
</ion-toggle>
|
||||||
<ion-note *ngIf="processor.locked">
|
<ion-note *ngIf="processor.locked">
|
||||||
{{'core.settings.locked' | translate }}
|
{{'core.settings.locked' | translate }}
|
||||||
|
@ -144,7 +133,11 @@
|
||||||
<!-- General settings. -->
|
<!-- General settings. -->
|
||||||
<ion-card>
|
<ion-card>
|
||||||
<ion-list class="ion-text-wrap">
|
<ion-list class="ion-text-wrap">
|
||||||
<ion-item-divider><ion-label><h2>{{ 'core.settings.general' | translate }}</h2></ion-label></ion-item-divider>
|
<ion-item-divider>
|
||||||
|
<ion-label>
|
||||||
|
<h2>{{ 'core.settings.general' | translate }}</h2>
|
||||||
|
</ion-label>
|
||||||
|
</ion-item-divider>
|
||||||
<ion-item class="ion-text-wrap">
|
<ion-item class="ion-text-wrap">
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<p class="item-heading">{{ 'addon.messages.useentertosend' | translate }}</p>
|
<p class="item-heading">{{ 'addon.messages.useentertosend' | translate }}</p>
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
<ion-header>
|
<ion-header>
|
||||||
<ion-toolbar>
|
<ion-toolbar>
|
||||||
|
<ion-title>
|
||||||
<h2>{{ plugin.name }}</h2>
|
<h2>{{ plugin.name }}</h2>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
<ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
||||||
<ion-icon slot="icon-only" name="fas-times" aria-hidden="true"></ion-icon>
|
<ion-icon slot="icon-only" name="fas-times" aria-hidden="true"></ion-icon>
|
||||||
|
@ -10,8 +12,7 @@
|
||||||
</ion-header>
|
</ion-header>
|
||||||
<ion-content>
|
<ion-content>
|
||||||
<form name="addon-mod_assign-edit-feedback-form" *ngIf="userId && plugin" #editFeedbackForm>
|
<form name="addon-mod_assign-edit-feedback-form" *ngIf="userId && plugin" #editFeedbackForm>
|
||||||
<addon-mod-assign-feedback-plugin [assign]="assign" [submission]="submission" [userId]="userId"
|
<addon-mod-assign-feedback-plugin [assign]="assign" [submission]="submission" [userId]="userId" [plugin]="plugin" [edit]="true">
|
||||||
[plugin]="plugin" [edit]="true">
|
|
||||||
</addon-mod-assign-feedback-plugin>
|
</addon-mod-assign-feedback-plugin>
|
||||||
<ion-button expand="block" (click)="done($event)">{{ 'core.done' | translate }}</ion-button>
|
<ion-button expand="block" (click)="done($event)">{{ 'core.done' | translate }}</ion-button>
|
||||||
</form>
|
</form>
|
||||||
|
|
|
@ -3,10 +3,12 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>
|
<h1>
|
||||||
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="moduleId" [courseId]="courseId">
|
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="moduleId" [courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</h1>
|
</h1>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button fill="clear" (click)="save()">
|
<ion-button fill="clear" (click)="save()">
|
||||||
{{ 'core.save' | translate }}
|
{{ 'core.save' | translate }}
|
||||||
|
|
|
@ -3,10 +3,12 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>
|
<h1>
|
||||||
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId">
|
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</h1>
|
</h1>
|
||||||
|
</ion-title>
|
||||||
|
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<!-- The buttons defined by the component will be added in here. -->
|
<!-- The buttons defined by the component will be added in here. -->
|
||||||
|
|
|
@ -3,10 +3,12 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>
|
<h1>
|
||||||
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="moduleId" [courseId]="courseId">
|
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="moduleId" [courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</h1>
|
</h1>
|
||||||
|
</ion-title>
|
||||||
|
|
||||||
<ion-buttons slot="end"></ion-buttons>
|
<ion-buttons slot="end"></ion-buttons>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
|
|
|
@ -3,10 +3,12 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>
|
<h1>
|
||||||
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="moduleId" [courseId]="courseId">
|
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="moduleId" [courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</h1>
|
</h1>
|
||||||
|
</ion-title>
|
||||||
|
|
||||||
<ion-buttons slot="end"></ion-buttons>
|
<ion-buttons slot="end"></ion-buttons>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
<ion-header>
|
<ion-header>
|
||||||
<ion-toolbar>
|
<ion-toolbar>
|
||||||
<h1>{{ 'addon.mod_book.toc' | translate }}</h1>
|
<ion-title>
|
||||||
|
<h2>{{ 'addon.mod_book.toc' | translate }}</h2>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
<ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
||||||
<ion-icon name="fas-times" slot="icon-only" aria-hidden=true></ion-icon>
|
<ion-icon name="fas-times" slot="icon-only" aria-hidden=true></ion-icon>
|
||||||
|
@ -12,14 +14,12 @@
|
||||||
<nav>
|
<nav>
|
||||||
<ion-list>
|
<ion-list>
|
||||||
<ion-item class="ion-text-wrap" *ngFor="let chapter of chapters" (click)="loadChapter(chapter.id)"
|
<ion-item class="ion-text-wrap" *ngFor="let chapter of chapters" (click)="loadChapter(chapter.id)"
|
||||||
[attr.aria-current]="selected == chapter.id ? 'page' : 'false'" button
|
[attr.aria-current]="selected == chapter.id ? 'page' : 'false'" button [class.item-dimmed]="chapter.hidden" detail="false">
|
||||||
[class.item-dimmed]="chapter.hidden" detail="false">
|
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<p [class.ion-padding-start]="addPadding && chapter.level == 1 ? true : null" class="item-heading">
|
<p [class.ion-padding-start]="addPadding && chapter.level == 1 ? true : null" class="item-heading">
|
||||||
<span *ngIf="showNumbers" class="addon-mod-book-number">{{chapter.indexNumber}} </span>
|
<span *ngIf="showNumbers" class="addon-mod-book-number">{{chapter.indexNumber}} </span>
|
||||||
<span *ngIf="showBullets" class="addon-mod-book-bullet">• </span>
|
<span *ngIf="showBullets" class="addon-mod-book-bullet">• </span>
|
||||||
<core-format-text [text]="chapter.title" contextLevel="module" [contextInstanceId]="moduleId"
|
<core-format-text [text]="chapter.title" contextLevel="module" [contextInstanceId]="moduleId" [courseId]="courseId">
|
||||||
[courseId]="courseId">
|
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</p>
|
</p>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
|
|
|
@ -3,10 +3,12 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>
|
<h1>
|
||||||
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId">
|
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</h1>
|
</h1>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<!-- The buttons defined by the component will be added in here. -->
|
<!-- The buttons defined by the component will be added in here. -->
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
|
|
@ -1,9 +1,8 @@
|
||||||
<ion-header>
|
<ion-header>
|
||||||
<ion-toolbar>
|
<ion-toolbar>
|
||||||
<ion-buttons slot="start">
|
<ion-title>
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
|
||||||
</ion-buttons>
|
|
||||||
<h2>{{ 'addon.mod_chat.currentusers' | translate }}</h2>
|
<h2>{{ 'addon.mod_chat.currentusers' | translate }}</h2>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
<ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
||||||
<ion-icon slot="icon-only" name="fas-times" aria-hidden="true"></ion-icon>
|
<ion-icon slot="icon-only" name="fas-times" aria-hidden="true"></ion-icon>
|
||||||
|
@ -13,8 +12,7 @@
|
||||||
</ion-header>
|
</ion-header>
|
||||||
<ion-content>
|
<ion-content>
|
||||||
<core-loading [hideUntil]="usersLoaded">
|
<core-loading [hideUntil]="usersLoaded">
|
||||||
<ion-item class="ion-text-wrap" *ngFor="let user of users"
|
<ion-item class="ion-text-wrap" *ngFor="let user of users" [class.addon-mod-chat-user]="currentUserId != user.id && isOnline">
|
||||||
[class.addon-mod-chat-user]="currentUserId != user.id && isOnline">
|
|
||||||
|
|
||||||
<core-user-avatar [user]="user" slot="start" [linkProfile]="false"></core-user-avatar>
|
<core-user-avatar [user]="user" slot="start" [linkProfile]="false"></core-user-avatar>
|
||||||
<ion-label>
|
<ion-label>
|
||||||
|
|
|
@ -3,10 +3,12 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>
|
<h1>
|
||||||
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId">
|
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</h1>
|
</h1>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button fill="clear" *ngIf="loaded" (click)="showChatUsers()" [attr.aria-label]="'core.users' | translate">
|
<ion-button fill="clear" *ngIf="loaded" (click)="showChatUsers()" [attr.aria-label]="'core.users' | translate">
|
||||||
<ion-icon name="fas-users" slot="icon-only" aria-hidden="true"></ion-icon>
|
<ion-icon name="fas-users" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
|
@ -81,8 +83,7 @@
|
||||||
|
|
||||||
<ion-item *ngIf="!message.special" class="ion-text-wrap addon-message"
|
<ion-item *ngIf="!message.special" class="ion-text-wrap addon-message"
|
||||||
[class.addon-message-mine]="message.userid == currentUserId"
|
[class.addon-message-mine]="message.userid == currentUserId"
|
||||||
[class.addon-message-not-mine]="message.userid != currentUserId"
|
[class.addon-message-not-mine]="message.userid != currentUserId" [class.addon-message-no-user]="!message.showUserData"
|
||||||
[class.addon-message-no-user]="!message.showUserData"
|
|
||||||
[@coreSlideInOut]="message.userid == currentUserId ? '' : 'fromLeft'">
|
[@coreSlideInOut]="message.userid == currentUserId ? '' : 'fromLeft'">
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<!-- User data. -->
|
<!-- User data. -->
|
||||||
|
@ -104,8 +105,7 @@
|
||||||
</ng-container>
|
</ng-container>
|
||||||
</ion-list>
|
</ion-list>
|
||||||
|
|
||||||
<core-empty-box *ngIf="!messages || messages.length <= 0" icon="far-comments"
|
<core-empty-box *ngIf="!messages || messages.length <= 0" icon="far-comments" [message]="'addon.mod_chat.nomessages' | translate">
|
||||||
[message]="'addon.mod_chat.nomessages' | translate">
|
|
||||||
</core-empty-box>
|
</core-empty-box>
|
||||||
</core-loading>
|
</core-loading>
|
||||||
</ion-content>
|
</ion-content>
|
||||||
|
|
|
@ -3,10 +3,12 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>
|
<h1>
|
||||||
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId">
|
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</h1>
|
</h1>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<!-- The buttons defined by the component will be added in here. -->
|
<!-- The buttons defined by the component will be added in here. -->
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
|
|
@ -3,7 +3,9 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>{{ 'addon.mod_chat.messages' | translate }}</h1>
|
<h1>{{ 'addon.mod_chat.messages' | translate }}</h1>
|
||||||
|
</ion-title>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
</ion-header>
|
</ion-header>
|
||||||
<ion-content>
|
<ion-content>
|
||||||
|
@ -75,8 +77,7 @@
|
||||||
|
|
||||||
<ion-item *ngIf="!message.special" class="ion-text-wrap addon-message"
|
<ion-item *ngIf="!message.special" class="ion-text-wrap addon-message"
|
||||||
[class.addon-message-mine]="message.userid == currentUserId"
|
[class.addon-message-mine]="message.userid == currentUserId"
|
||||||
[class.addon-message-not-mine]="message.userid != currentUserId"
|
[class.addon-message-not-mine]="message.userid != currentUserId" [class.addon-message-no-user]="!message.showUserData">
|
||||||
[class.addon-message-no-user]="!message.showUserData">
|
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<!-- User data. -->
|
<!-- User data. -->
|
||||||
<h2 class="addon-message-user">
|
<h2 class="addon-message-user">
|
||||||
|
|
|
@ -3,7 +3,9 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>{{ 'addon.mod_chat.chatreport' | translate }}</h1>
|
<h1>{{ 'addon.mod_chat.chatreport' | translate }}</h1>
|
||||||
|
</ion-title>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
</ion-header>
|
</ion-header>
|
||||||
<ion-content>
|
<ion-content>
|
||||||
|
|
|
@ -3,10 +3,12 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>
|
<h1>
|
||||||
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId">
|
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</h1>
|
</h1>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<!-- The buttons defined by the component will be added in here. -->
|
<!-- The buttons defined by the component will be added in here. -->
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
|
|
@ -1,9 +1,8 @@
|
||||||
<ion-header>
|
<ion-header>
|
||||||
<ion-toolbar>
|
<ion-toolbar>
|
||||||
<ion-buttons slot="start">
|
<ion-title>
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
|
||||||
</ion-buttons>
|
|
||||||
<h2>{{ 'addon.mod_data.search' | translate }}</h2>
|
<h2>{{ 'addon.mod_data.search' | translate }}</h2>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
<ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
||||||
<ion-icon name="fas-times" slot="icon-only" aria-hidden=true></ion-icon>
|
<ion-icon name="fas-times" slot="icon-only" aria-hidden=true></ion-icon>
|
||||||
|
@ -20,14 +19,14 @@
|
||||||
<ion-list class="ion-no-margin">
|
<ion-list class="ion-no-margin">
|
||||||
<ion-item [hidden]="search.searchingAdvanced">
|
<ion-item [hidden]="search.searchingAdvanced">
|
||||||
<ion-label class="sr-only">{{ 'addon.mod_data.search' | translate}}</ion-label>
|
<ion-label class="sr-only">{{ 'addon.mod_data.search' | translate}}</ion-label>
|
||||||
<ion-input type="text" placeholder="{{ 'addon.mod_data.search' | translate}}"
|
<ion-input type="text" placeholder="{{ 'addon.mod_data.search' | translate}}" [(ngModel)]="search.text" name="text"
|
||||||
[(ngModel)]="search.text" name="text" formControlName="text">
|
formControlName="text">
|
||||||
</ion-input>
|
</ion-input>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ion-item class="ion-text-wrap">
|
<ion-item class="ion-text-wrap">
|
||||||
<ion-label position="stacked">{{ 'core.sortby' | translate }}</ion-label>
|
<ion-label position="stacked">{{ 'core.sortby' | translate }}</ion-label>
|
||||||
<ion-select interface="action-sheet" name="sortBy" formControlName="sortBy"
|
<ion-select interface="action-sheet" name="sortBy" formControlName="sortBy" [placeholder]="'core.sortby' | translate"
|
||||||
[placeholder]="'core.sortby' | translate" [interfaceOptions]="{header: 'core.sortby' | translate}">
|
[interfaceOptions]="{header: 'core.sortby' | translate}">
|
||||||
<optgroup *ngIf="fieldsArray.length" label="{{ 'addon.mod_data.fields' | translate }}">
|
<optgroup *ngIf="fieldsArray.length" label="{{ 'addon.mod_data.fields' | translate }}">
|
||||||
<ion-select-option *ngFor="let field of fieldsArray" [value]="field.id">{{field.name}}</ion-select-option>
|
<ion-select-option *ngFor="let field of fieldsArray" [value]="field.id">{{field.name}}</ion-select-option>
|
||||||
</optgroup>
|
</optgroup>
|
||||||
|
|
|
@ -3,10 +3,12 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>
|
<h1>
|
||||||
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId">
|
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</h1>
|
</h1>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button *ngIf="entry" fill="clear" (click)="save($event)">
|
<ion-button *ngIf="entry" fill="clear" (click)="save($event)">
|
||||||
{{ 'core.save' | translate }}
|
{{ 'core.save' | translate }}
|
||||||
|
|
|
@ -3,15 +3,16 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>
|
<h1>
|
||||||
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId">
|
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</h1>
|
</h1>
|
||||||
|
</ion-title>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
</ion-header>
|
</ion-header>
|
||||||
<ion-content>
|
<ion-content>
|
||||||
<ion-refresher slot="fixed"
|
<ion-refresher slot="fixed" [disabled]="!entryLoaded || !(isPullingToRefresh || !renderingEntry && !loadingRating && !loadingComments)"
|
||||||
[disabled]="!entryLoaded || !(isPullingToRefresh || !renderingEntry && !loadingRating && !loadingComments)"
|
|
||||||
(ionRefresh)="refreshDatabase($event.target)">
|
(ionRefresh)="refreshDatabase($event.target)">
|
||||||
<ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content>
|
<ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content>
|
||||||
</ion-refresher>
|
</ion-refresher>
|
||||||
|
@ -40,23 +41,23 @@
|
||||||
<div class="addon-data-contents addon-data-entry addon-data-entries-{{database.id}}" *ngIf="database && entry">
|
<div class="addon-data-contents addon-data-entry addon-data-entries-{{database.id}}" *ngIf="database && entry">
|
||||||
<core-style [css]="database.csstemplate" prefix=".addon-data-entries-{{database.id}}"></core-style>
|
<core-style [css]="database.csstemplate" prefix=".addon-data-entries-{{database.id}}"></core-style>
|
||||||
|
|
||||||
<core-compile-html [text]="entryHtml" [jsData]="jsData" [extraImports]="extraImports"
|
<core-compile-html [text]="entryHtml" [jsData]="jsData" [extraImports]="extraImports" (compiling)="setRenderingEntry($event)">
|
||||||
(compiling)="setRenderingEntry($event)"></core-compile-html>
|
</core-compile-html>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<core-rating-rate *ngIf="database && entry && ratingInfo && (!database.approval || entry.approved)"
|
<core-rating-rate *ngIf="database && entry && ratingInfo && (!database.approval || entry.approved)" [ratingInfo]="ratingInfo"
|
||||||
[ratingInfo]="ratingInfo" contextLevel="module" [instanceId]="database.coursemodule" [itemId]="entry.id" [itemSetId]="0"
|
contextLevel="module" [instanceId]="database.coursemodule" [itemId]="entry.id" [itemSetId]="0" [courseId]="courseId"
|
||||||
[courseId]="courseId" [aggregateMethod]="database.assessed" [scaleId]="database.scale" [userId]="entry.userid"
|
[aggregateMethod]="database.assessed" [scaleId]="database.scale" [userId]="entry.userid" (onLoading)="setLoadingRating($event)"
|
||||||
(onLoading)="setLoadingRating($event)" (onUpdate)="ratingUpdated()">
|
(onUpdate)="ratingUpdated()">
|
||||||
</core-rating-rate>
|
</core-rating-rate>
|
||||||
<core-rating-aggregate *ngIf="database && entry && ratingInfo" [ratingInfo]="ratingInfo" contextLevel="module"
|
<core-rating-aggregate *ngIf="database && entry && ratingInfo" [ratingInfo]="ratingInfo" contextLevel="module"
|
||||||
[instanceId]="database.coursemodule" [itemId]="entry.id" [courseId]="courseId" [aggregateMethod]="database.assessed"
|
[instanceId]="database.coursemodule" [itemId]="entry.id" [courseId]="courseId" [aggregateMethod]="database.assessed"
|
||||||
[scaleId]="database.scale">
|
[scaleId]="database.scale">
|
||||||
</core-rating-aggregate>
|
</core-rating-aggregate>
|
||||||
|
|
||||||
<core-comments *ngIf="database && database.comments && entry && entry.id > 0 && commentsEnabled"
|
<core-comments *ngIf="database && database.comments && entry && entry.id > 0 && commentsEnabled" contextLevel="module"
|
||||||
contextLevel="module" [instanceId]="database.coursemodule" component="mod_data" [itemId]="entry.id"
|
[instanceId]="database.coursemodule" component="mod_data" [itemId]="entry.id" area="database_entry" [courseId]="courseId"
|
||||||
area="database_entry" [courseId]="courseId" (onLoading)="setLoadingComments($event)" [showItem]="true">
|
(onLoading)="setLoadingComments($event)" [showItem]="true">
|
||||||
</core-comments>
|
</core-comments>
|
||||||
|
|
||||||
<ion-grid *ngIf="hasPrevious || hasNext">
|
<ion-grid *ngIf="hasPrevious || hasNext">
|
||||||
|
|
|
@ -3,10 +3,12 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>
|
<h1>
|
||||||
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId">
|
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</h1>
|
</h1>
|
||||||
|
</ion-title>
|
||||||
|
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<!-- The buttons defined by the component will be added in here. -->
|
<!-- The buttons defined by the component will be added in here. -->
|
||||||
|
|
|
@ -3,12 +3,12 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
<h1>
|
<ion-title>
|
||||||
<ng-container *ngIf="attempt">{{ attempt.fullname }}</ng-container>
|
<h1 *ngIf="attempt">{{ attempt.fullname }}</h1>
|
||||||
<ng-container *ngIf="anonAttempt">
|
<h1 *ngIf="anonAttempt">
|
||||||
{{ 'addon.mod_feedback.response_nr' |translate }}: {{anonAttempt.number}}
|
{{ 'addon.mod_feedback.response_nr' |translate }}: {{anonAttempt.number}}
|
||||||
</ng-container>
|
|
||||||
</h1>
|
</h1>
|
||||||
|
</ion-title>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
</ion-header>
|
</ion-header>
|
||||||
<ion-content>
|
<ion-content>
|
||||||
|
@ -38,8 +38,8 @@
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<h2 *ngIf="item.name" [core-mark-required]="item.required">
|
<h2 *ngIf="item.name" [core-mark-required]="item.required">
|
||||||
<span *ngIf="feedback!.autonumbering && item.itemnumber">{{item.itemnumber}}. </span>
|
<span *ngIf="feedback!.autonumbering && item.itemnumber">{{item.itemnumber}}. </span>
|
||||||
<core-format-text [component]="component" [componentId]="cmId" [text]="item.name"
|
<core-format-text [component]="component" [componentId]="cmId" [text]="item.name" contextLevel="module"
|
||||||
contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId">
|
[contextInstanceId]="cmId" [courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</h2>
|
</h2>
|
||||||
<p *ngIf="item.submittedValue">
|
<p *ngIf="item.submittedValue">
|
||||||
|
|
|
@ -3,10 +3,12 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>
|
<h1>
|
||||||
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId">
|
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</h1>
|
</h1>
|
||||||
|
</ion-title>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
</ion-header>
|
</ion-header>
|
||||||
<ion-content>
|
<ion-content>
|
||||||
|
@ -28,22 +30,20 @@
|
||||||
<ion-label [position]="item.hasTextInput ? 'stacked' : undefined">
|
<ion-label [position]="item.hasTextInput ? 'stacked' : undefined">
|
||||||
<p *ngIf="item.name" [core-mark-required]="item.required">
|
<p *ngIf="item.name" [core-mark-required]="item.required">
|
||||||
<span *ngIf="feedback!.autonumbering && item.itemnumber">{{item.itemnumber}}. </span>
|
<span *ngIf="feedback!.autonumbering && item.itemnumber">{{item.itemnumber}}. </span>
|
||||||
<core-format-text [component]="component" [componentId]="cmId" [text]="item.name"
|
<core-format-text [component]="component" [componentId]="cmId" [text]="item.name" contextLevel="module"
|
||||||
contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId" [wsNotFiltered]="true">
|
[contextInstanceId]="cmId" [courseId]="courseId" [wsNotFiltered]="true">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
<span *ngIf="item.postfix" class="addon-mod_feedback-postfix">{{item.postfix}}</span>
|
<span *ngIf="item.postfix" class="addon-mod_feedback-postfix">{{item.postfix}}</span>
|
||||||
</p>
|
</p>
|
||||||
<p *ngIf="item.templateName == 'label'">
|
<p *ngIf="item.templateName == 'label'">
|
||||||
<core-format-text [component]="component" [componentId]="cmId"
|
<core-format-text [component]="component" [componentId]="cmId" [text]="item.presentation"
|
||||||
[text]="item.presentation" contextLevel="module" [contextInstanceId]="cmId"
|
contextLevel="module" [contextInstanceId]="cmId" [wsNotFiltered]="true" [courseId]="courseId">
|
||||||
[wsNotFiltered]="true" [courseId]="courseId">
|
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</p>
|
</p>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
|
|
||||||
<ion-input *ngIf="item.templateName == 'textfield'" type="text" [(ngModel)]="item.value"
|
<ion-input *ngIf="item.templateName == 'textfield'" type="text" [(ngModel)]="item.value" autocorrect="off"
|
||||||
autocorrect="off" name="{{item.typ}}_{{item.id}}" maxlength="{{item.length}}"
|
name="{{item.typ}}_{{item.id}}" maxlength="{{item.length}}" [required]="item.required">
|
||||||
[required]="item.required">
|
|
||||||
</ion-input>
|
</ion-input>
|
||||||
|
|
||||||
<ng-container *ngIf="item.templateName == 'numeric'">
|
<ng-container *ngIf="item.templateName == 'numeric'">
|
||||||
|
@ -56,8 +56,8 @@
|
||||||
</ion-text>
|
</ion-text>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
<ion-textarea *ngIf="item.templateName == 'textarea'" [required]="item.required"
|
<ion-textarea *ngIf="item.templateName == 'textarea'" [required]="item.required" name="{{item.typ}}_{{item.id}}"
|
||||||
name="{{item.typ}}_{{item.id}}" [(ngModel)]="item.value">
|
[(ngModel)]="item.value">
|
||||||
</ion-textarea>
|
</ion-textarea>
|
||||||
|
|
||||||
<ion-select *ngIf="item.templateName == 'multichoice-d'" [required]="item.required"
|
<ion-select *ngIf="item.templateName == 'multichoice-d'" [required]="item.required"
|
||||||
|
@ -65,20 +65,18 @@
|
||||||
[interfaceOptions]="{header: item.name}">
|
[interfaceOptions]="{header: item.name}">
|
||||||
<ion-select-option *ngFor="let option of item.choices" [value]="option.value">
|
<ion-select-option *ngFor="let option of item.choices" [value]="option.value">
|
||||||
<core-format-text [component]="component" [componentId]="cmId" [text]="option.label"
|
<core-format-text [component]="component" [componentId]="cmId" [text]="option.label"
|
||||||
contextLevel="module" [contextInstanceId]="cmId" [wsNotFiltered]="true"
|
contextLevel="module" [contextInstanceId]="cmId" [wsNotFiltered]="true" [courseId]="courseId">
|
||||||
[courseId]="courseId">
|
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</ion-select-option>
|
</ion-select-option>
|
||||||
</ion-select>
|
</ion-select>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
|
||||||
<ion-radio-group *ngIf="item.templateName == 'multichoice-r'" [(ngModel)]="item.value"
|
<ion-radio-group *ngIf="item.templateName == 'multichoice-r'" [(ngModel)]="item.value" [required]="item.required"
|
||||||
[required]="item.required" name="{{item.typ}}_{{item.id}}">
|
name="{{item.typ}}_{{item.id}}">
|
||||||
<ion-item *ngFor="let option of item.choices">
|
<ion-item *ngFor="let option of item.choices">
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<core-format-text [component]="component" [componentId]="cmId"
|
<core-format-text [component]="component" [componentId]="cmId" [text]="option.label"
|
||||||
[text]="option.label" contextLevel="module" [contextInstanceId]="cmId"
|
contextLevel="module" [contextInstanceId]="cmId" [wsNotFiltered]="true" [courseId]="courseId">
|
||||||
[wsNotFiltered]="true" [courseId]="courseId">
|
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
<ion-radio slot="start" [value]="option.value"></ion-radio>
|
<ion-radio slot="start" [value]="option.value"></ion-radio>
|
||||||
|
@ -89,19 +87,18 @@
|
||||||
<ion-item *ngFor="let option of item.choices">
|
<ion-item *ngFor="let option of item.choices">
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<core-format-text [component]="component" [componentId]="cmId" [text]="option.label"
|
<core-format-text [component]="component" [componentId]="cmId" [text]="option.label"
|
||||||
contextLevel="module" [contextInstanceId]="cmId" [wsNotFiltered]="true"
|
contextLevel="module" [contextInstanceId]="cmId" [wsNotFiltered]="true" [courseId]="courseId">
|
||||||
[courseId]="courseId">
|
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
<ion-checkbox [required]="item.required" name="{{item.typ}}_{{item.id}}"
|
<ion-checkbox [required]="item.required" name="{{item.typ}}_{{item.id}}" [(ngModel)]="option.checked"
|
||||||
[(ngModel)]="option.checked" value="option.value">
|
value="option.value">
|
||||||
</ion-checkbox>
|
</ion-checkbox>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
<ng-container *ngIf="item.templateName == 'captcha'">
|
<ng-container *ngIf="item.templateName == 'captcha'">
|
||||||
<core-recaptcha *ngIf="!preview && !offline" [publicKey]="item.captcha.recaptchapublickey"
|
<core-recaptcha *ngIf="!preview && !offline" [publicKey]="item.captcha.recaptchapublickey" [model]="item"
|
||||||
[model]="item" modelValueName="value">
|
modelValueName="value">
|
||||||
</core-recaptcha>
|
</core-recaptcha>
|
||||||
<div *ngIf="!preview && (!item.captcha || offline)" class="core-warning-card">
|
<div *ngIf="!preview && (!item.captcha || offline)" class="core-warning-card">
|
||||||
<ion-item>
|
<ion-item>
|
||||||
|
|
|
@ -3,10 +3,12 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>
|
<h1>
|
||||||
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId">
|
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</h1>
|
</h1>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<!-- The buttons defined by the component will be added in here. -->
|
<!-- The buttons defined by the component will be added in here. -->
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
|
|
@ -3,7 +3,9 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>{{ 'addon.mod_feedback.responses' |translate }}</h1>
|
<h1>{{ 'addon.mod_feedback.responses' |translate }}</h1>
|
||||||
|
</ion-title>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
</ion-header>
|
</ion-header>
|
||||||
<ion-content>
|
<ion-content>
|
||||||
|
@ -27,7 +29,9 @@
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
|
||||||
<ion-item-divider>
|
<ion-item-divider>
|
||||||
<ion-label><h2>{{ 'addon.mod_feedback.non_respondents_students' | translate : {$a: total } }}</h2></ion-label>
|
<ion-label>
|
||||||
|
<h2>{{ 'addon.mod_feedback.non_respondents_students' | translate : {$a: total } }}</h2>
|
||||||
|
</ion-label>
|
||||||
</ion-item-divider>
|
</ion-item-divider>
|
||||||
<ng-container *ngIf="total > 0">
|
<ng-container *ngIf="total > 0">
|
||||||
<ion-item *ngFor="let user of users" class="ion-text-wrap">
|
<ion-item *ngFor="let user of users" class="ion-text-wrap">
|
||||||
|
|
|
@ -3,7 +3,9 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>{{ 'addon.mod_feedback.responses' |translate }}</h1>
|
<h1>{{ 'addon.mod_feedback.responses' |translate }}</h1>
|
||||||
|
</ion-title>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
</ion-header>
|
</ion-header>
|
||||||
<ion-content>
|
<ion-content>
|
||||||
|
@ -48,7 +50,9 @@
|
||||||
{{ 'core.loadmore' | translate }}
|
{{ 'core.loadmore' | translate }}
|
||||||
</ion-button>
|
</ion-button>
|
||||||
<ion-item *ngIf="responses.responses.canLoadMore && loadingMore" class="ion-text-center">
|
<ion-item *ngIf="responses.responses.canLoadMore && loadingMore" class="ion-text-center">
|
||||||
<ion-label><ion-spinner [attr.aria-label]="'core.loading' | translate"></ion-spinner></ion-label>
|
<ion-label>
|
||||||
|
<ion-spinner [attr.aria-label]="'core.loading' | translate"></ion-spinner>
|
||||||
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
|
@ -71,7 +75,9 @@
|
||||||
{{ 'core.loadmore' | translate }}
|
{{ 'core.loadmore' | translate }}
|
||||||
</ion-button>
|
</ion-button>
|
||||||
<ion-item *ngIf="responses.anonResponses.canLoadMore && loadingMore" class="ion-text-center">
|
<ion-item *ngIf="responses.anonResponses.canLoadMore && loadingMore" class="ion-text-center">
|
||||||
<ion-label><ion-spinner [attr.aria-label]="'core.loading' | translate"></ion-spinner></ion-label>
|
<ion-label>
|
||||||
|
<ion-spinner [attr.aria-label]="'core.loading' | translate"></ion-spinner>
|
||||||
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
</ion-list>
|
</ion-list>
|
||||||
|
|
|
@ -3,10 +3,12 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>
|
<h1>
|
||||||
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId">
|
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</h1>
|
</h1>
|
||||||
|
</ion-title>
|
||||||
|
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<!-- The buttons defined by the component will be added in here. -->
|
<!-- The buttons defined by the component will be added in here. -->
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
<ion-header>
|
<ion-header>
|
||||||
<ion-toolbar>
|
<ion-toolbar>
|
||||||
|
<ion-title>
|
||||||
<h2 id="addon-mod-forum-sort-order-label">{{ 'core.sort' | translate }}</h2>
|
<h2 id="addon-mod-forum-sort-order-label">{{ 'core.sort' | translate }}</h2>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
<ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
||||||
<ion-icon name="fas-times" slot="icon-only" aria-hidden="true"></ion-icon>
|
<ion-icon name="fas-times" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
|
|
|
@ -3,10 +3,12 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1 *ngIf="startingPost">
|
<h1 *ngIf="startingPost">
|
||||||
<core-format-text contextLevel="module" [text]="startingPost.subject" [contextInstanceId]="cmId" [courseId]="courseId">
|
<core-format-text contextLevel="module" [text]="startingPost.subject" [contextInstanceId]="cmId" [courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</h1>
|
</h1>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<!-- The context menu will be added in here. -->
|
<!-- The context menu will be added in here. -->
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
@ -14,48 +16,41 @@
|
||||||
</ion-header>
|
</ion-header>
|
||||||
<core-navbar-buttons slot="end">
|
<core-navbar-buttons slot="end">
|
||||||
<core-context-menu>
|
<core-context-menu>
|
||||||
<core-context-menu-item *ngIf="discussionLoaded && !postHasOffline && isOnline"
|
<core-context-menu-item *ngIf="discussionLoaded && !postHasOffline && isOnline" [priority]="650"
|
||||||
[priority]="650" [content]="'addon.mod_forum.refreshposts' | translate" [iconAction]="refreshIcon" [closeOnClick]="false"
|
[content]="'addon.mod_forum.refreshposts' | translate" [iconAction]="refreshIcon" [closeOnClick]="false"
|
||||||
(action)="doRefresh(null, $event)">
|
(action)="doRefresh(null, $event)">
|
||||||
</core-context-menu-item>
|
</core-context-menu-item>
|
||||||
<core-context-menu-item *ngIf="discussionLoaded && isMobile && postHasOffline && isOnline"
|
<core-context-menu-item *ngIf="discussionLoaded && isMobile && postHasOffline && isOnline" [priority]="550"
|
||||||
[priority]="550" [content]="'core.settings.synchronizenow' | translate" [iconAction]="syncIcon" [closeOnClick]="false"
|
[content]="'core.settings.synchronizenow' | translate" [iconAction]="syncIcon" [closeOnClick]="false"
|
||||||
(action)="doRefresh(null, $event, true)">
|
(action)="doRefresh(null, $event, true)">
|
||||||
</core-context-menu-item>
|
</core-context-menu-item>
|
||||||
<core-context-menu-item [hidden]="sort == 'flat-oldest'"
|
<core-context-menu-item [hidden]="sort == 'flat-oldest'" [priority]="500"
|
||||||
[priority]="500" [content]="'addon.mod_forum.modeflatoldestfirst' | translate" iconAction="fas-arrow-down"
|
[content]="'addon.mod_forum.modeflatoldestfirst' | translate" iconAction="fas-arrow-down" (action)="changeSort('flat-oldest')">
|
||||||
(action)="changeSort('flat-oldest')">
|
|
||||||
</core-context-menu-item>
|
</core-context-menu-item>
|
||||||
<core-context-menu-item [hidden]="sort == 'flat-newest'"
|
<core-context-menu-item [hidden]="sort == 'flat-newest'" [priority]="450"
|
||||||
[priority]="450" [content]="'addon.mod_forum.modeflatnewestfirst' | translate" iconAction="fas-arrow-up"
|
[content]="'addon.mod_forum.modeflatnewestfirst' | translate" iconAction="fas-arrow-up" (action)="changeSort('flat-newest')">
|
||||||
(action)="changeSort('flat-newest')">
|
|
||||||
</core-context-menu-item>
|
</core-context-menu-item>
|
||||||
<core-context-menu-item [hidden]="sort == 'nested'"
|
<core-context-menu-item [hidden]="sort == 'nested'" [priority]="400" [content]="'addon.mod_forum.modenested' | translate"
|
||||||
[priority]="400" [content]="'addon.mod_forum.modenested' | translate" iconAction="fas-exchange-alt"
|
iconAction="fas-exchange-alt" (action)="changeSort('nested')">
|
||||||
(action)="changeSort('nested')">
|
|
||||||
</core-context-menu-item>
|
</core-context-menu-item>
|
||||||
<core-context-menu-item [hidden]="!discussion || !discussion.canlock || discussion.locked"
|
<core-context-menu-item [hidden]="!discussion || !discussion.canlock || discussion.locked" [priority]="300"
|
||||||
[priority]="300" [content]="'addon.mod_forum.lockdiscussion' | translate" iconAction="fas-lock"
|
[content]="'addon.mod_forum.lockdiscussion' | translate" iconAction="fas-lock" (action)="setLockState(true)">
|
||||||
(action)="setLockState(true)">
|
|
||||||
</core-context-menu-item>
|
</core-context-menu-item>
|
||||||
<core-context-menu-item [hidden]="!discussion || !discussion.canlock || !discussion.locked"
|
<core-context-menu-item [hidden]="!discussion || !discussion.canlock || !discussion.locked" [priority]="300"
|
||||||
[priority]="300" [content]="'addon.mod_forum.unlockdiscussion' | translate" iconAction="fas-unlock"
|
[content]="'addon.mod_forum.unlockdiscussion' | translate" iconAction="fas-unlock" (action)="setLockState(false)">
|
||||||
(action)="setLockState(false)">
|
|
||||||
</core-context-menu-item>
|
</core-context-menu-item>
|
||||||
<core-context-menu-item [hidden]="!discussion || !canPin || discussion.pinned"
|
<core-context-menu-item [hidden]="!discussion || !canPin || discussion.pinned" [priority]="250"
|
||||||
[priority]="250" [content]="'addon.mod_forum.pindiscussion' | translate" iconAction="fas-map-pin"
|
[content]="'addon.mod_forum.pindiscussion' | translate" iconAction="fas-map-pin" (action)="setPinState(true)">
|
||||||
(action)="setPinState(true)">
|
|
||||||
</core-context-menu-item>
|
</core-context-menu-item>
|
||||||
<core-context-menu-item [hidden]="!discussion || !canPin || !discussion.pinned"
|
<core-context-menu-item [hidden]="!discussion || !canPin || !discussion.pinned" [priority]="250"
|
||||||
[priority]="250" [content]="'addon.mod_forum.unpindiscussion' | translate" [iconSlash]="true" iconAction="fas-map-pin"
|
[content]="'addon.mod_forum.unpindiscussion' | translate" [iconSlash]="true" iconAction="fas-map-pin"
|
||||||
(action)="setPinState(false)">
|
(action)="setPinState(false)">
|
||||||
</core-context-menu-item>
|
</core-context-menu-item>
|
||||||
<core-context-menu-item [hidden]="!discussion || !discussion.canfavourite || discussion.starred"
|
<core-context-menu-item [hidden]="!discussion || !discussion.canfavourite || discussion.starred" [priority]="200"
|
||||||
[priority]="200" [content]="'addon.mod_forum.addtofavourites' | translate" iconAction="fas-star"
|
[content]="'addon.mod_forum.addtofavourites' | translate" iconAction="fas-star" (action)="toggleFavouriteState(true)">
|
||||||
(action)="toggleFavouriteState(true)">
|
|
||||||
</core-context-menu-item>
|
</core-context-menu-item>
|
||||||
<core-context-menu-item [hidden]="!discussion || !discussion.canfavourite || !discussion.starred"
|
<core-context-menu-item [hidden]="!discussion || !discussion.canfavourite || !discussion.starred" [priority]="200"
|
||||||
[priority]="200" [content]="'addon.mod_forum.removefromfavourites' | translate" iconAction="fas-star" [iconSlash]="true"
|
[content]="'addon.mod_forum.removefromfavourites' | translate" iconAction="fas-star" [iconSlash]="true"
|
||||||
(action)="toggleFavouriteState(false)">
|
(action)="toggleFavouriteState(false)">
|
||||||
</core-context-menu-item>
|
</core-context-menu-item>
|
||||||
</core-context-menu>
|
</core-context-menu>
|
||||||
|
@ -90,25 +85,20 @@
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
|
||||||
<div *ngIf="startingPost" class="ion-margin-bottom">
|
<div *ngIf="startingPost" class="ion-margin-bottom">
|
||||||
<addon-mod-forum-post
|
<addon-mod-forum-post [post]="startingPost" [discussion]="discussion" [courseId]="courseId" [highlight]="true"
|
||||||
[post]="startingPost" [discussion]="discussion" [courseId]="courseId" [highlight]="true"
|
[discussionId]="discussionId" [component]="component" [componentId]="cmId" [formData]="formData"
|
||||||
[discussionId]="discussionId" [component]="component" [componentId]="cmId"
|
[originalData]="originalData" [forum]="forum" [accessInfo]="accessInfo" [trackPosts]="trackPosts" [ratingInfo]="ratingInfo"
|
||||||
[formData]="formData" [originalData]="originalData" [forum]="forum" [accessInfo]="accessInfo"
|
[leavingPage]="leavingPage" (onPostChange)="postListChanged()">
|
||||||
[trackPosts]="trackPosts" [ratingInfo]="ratingInfo" [leavingPage]="leavingPage"
|
|
||||||
(onPostChange)="postListChanged()">
|
|
||||||
</addon-mod-forum-post>
|
</addon-mod-forum-post>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<ion-card *ngIf="sort != 'nested'">
|
<ion-card *ngIf="sort != 'nested'">
|
||||||
<ng-container *ngFor="let post of posts; first as first">
|
<ng-container *ngFor="let post of posts; first as first">
|
||||||
<core-spacer *ngIf="!first"></core-spacer>
|
<core-spacer *ngIf="!first"></core-spacer>
|
||||||
<addon-mod-forum-post
|
<addon-mod-forum-post [post]="post" [courseId]="courseId" [discussionId]="discussionId" [component]="component"
|
||||||
[post]="post" [courseId]="courseId" [discussionId]="discussionId"
|
[componentId]="cmId" [formData]="formData" [originalData]="originalData" [parentSubject]="postSubjects[post.parentid]"
|
||||||
[component]="component" [componentId]="cmId" [formData]="formData"
|
|
||||||
[originalData]="originalData" [parentSubject]="postSubjects[post.parentid]"
|
|
||||||
[forum]="forum" [accessInfo]="accessInfo" [trackPosts]="trackPosts" [ratingInfo]="ratingInfo"
|
[forum]="forum" [accessInfo]="accessInfo" [trackPosts]="trackPosts" [ratingInfo]="ratingInfo"
|
||||||
[leavingPage]="leavingPage"
|
[leavingPage]="leavingPage" (onPostChange)="postListChanged()">
|
||||||
(onPostChange)="postListChanged()">
|
|
||||||
</addon-mod-forum-post>
|
</addon-mod-forum-post>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
@ -121,12 +111,10 @@
|
||||||
|
|
||||||
<ng-template #nestedPosts let-post="post">
|
<ng-template #nestedPosts let-post="post">
|
||||||
<ion-card>
|
<ion-card>
|
||||||
<addon-mod-forum-post
|
<addon-mod-forum-post [post]="post" [courseId]="courseId" [discussionId]="discussionId" [component]="component"
|
||||||
[post]="post" [courseId]="courseId" [discussionId]="discussionId" [component]="component"
|
[componentId]="cmId" [formData]="formData" [originalData]="originalData" [parentSubject]="postSubjects[post.parentid]"
|
||||||
[componentId]="cmId" [formData]="formData" [originalData]="originalData"
|
[forum]="forum" [accessInfo]="accessInfo" [trackPosts]="trackPosts" [ratingInfo]="ratingInfo"
|
||||||
[parentSubject]="postSubjects[post.parentid]" [forum]="forum" [accessInfo]="accessInfo"
|
[leavingPage]="leavingPage" (onPostChange)="postListChanged()">
|
||||||
[trackPosts]="trackPosts" [ratingInfo]="ratingInfo" [leavingPage]="leavingPage"
|
|
||||||
(onPostChange)="postListChanged()">
|
|
||||||
</addon-mod-forum-post>
|
</addon-mod-forum-post>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
<div class="ion-padding-start" *ngIf="post.children && post.children.length && post.children[0].subject">
|
<div class="ion-padding-start" *ngIf="post.children && post.children.length && post.children[0].subject">
|
||||||
|
|
|
@ -3,10 +3,12 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>
|
<h1>
|
||||||
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId">
|
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</h1>
|
</h1>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<!-- The buttons defined by the component will be added in here. -->
|
<!-- The buttons defined by the component will be added in here. -->
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
|
|
@ -3,7 +3,9 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>{{ 'addon.mod_forum.addanewdiscussion' | translate }}</h1>
|
<h1>{{ 'addon.mod_forum.addanewdiscussion' | translate }}</h1>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<!-- The context menu will be added in here. -->
|
<!-- The context menu will be added in here. -->
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
@ -18,9 +20,8 @@
|
||||||
<form *ngIf="showForm" #newDiscFormEl>
|
<form *ngIf="showForm" #newDiscFormEl>
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-label position="stacked">{{ 'addon.mod_forum.subject' | translate }}</ion-label>
|
<ion-label position="stacked">{{ 'addon.mod_forum.subject' | translate }}</ion-label>
|
||||||
<ion-input
|
<ion-input [(ngModel)]="newDiscussion.subject" type="text" [placeholder]="'addon.mod_forum.subject' | translate"
|
||||||
[(ngModel)]="newDiscussion.subject"
|
name="subject">
|
||||||
type="text" [placeholder]="'addon.mod_forum.subject' | translate" name="subject">
|
|
||||||
</ion-input>
|
</ion-input>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ion-item>
|
<ion-item>
|
||||||
|
@ -31,19 +32,14 @@
|
||||||
(contentChanged)="onMessageChange($event)">
|
(contentChanged)="onMessageChange($event)">
|
||||||
</core-rich-text-editor>
|
</core-rich-text-editor>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ion-item
|
<ion-item button class="divider ion-text-wrap" (click)="toggleAdvanced()" detail="false" [attr.aria-expanded]="advanced"
|
||||||
button
|
[attr.aria-label]="(advanced ? 'core.hideadvanced' : 'core.showadvanced') | translate" role="heading"
|
||||||
class="divider ion-text-wrap"
|
aria-controls="addon-mod-forum-new-discussion-advanced">
|
||||||
(click)="toggleAdvanced()"
|
|
||||||
detail="false"
|
|
||||||
[attr.aria-expanded]="advanced"
|
|
||||||
[attr.aria-label]="(advanced ? 'core.hideadvanced' : 'core.showadvanced') | translate"
|
|
||||||
role="heading"
|
|
||||||
aria-controls="addon-mod-forum-new-discussion-advanced"
|
|
||||||
>
|
|
||||||
<ion-icon *ngIf="!advanced" name="fas-caret-right" flip-rtl slot="start" aria-hidden="true"></ion-icon>
|
<ion-icon *ngIf="!advanced" name="fas-caret-right" flip-rtl slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-icon *ngIf="advanced" name="fas-caret-down" slot="start" aria-hidden="true"></ion-icon>
|
<ion-icon *ngIf="advanced" name="fas-caret-down" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label><h2>{{ 'addon.mod_forum.advanced' | translate }}</h2></ion-label>
|
<ion-label>
|
||||||
|
<h2>{{ 'addon.mod_forum.advanced' | translate }}</h2>
|
||||||
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<div *ngIf="advanced" id="addon-mod-forum-new-discussion-advanced">
|
<div *ngIf="advanced" id="addon-mod-forum-new-discussion-advanced">
|
||||||
<ion-item *ngIf="showGroups && groupIds.length > 1 && accessInfo.cancanposttomygroups">
|
<ion-item *ngIf="showGroups && groupIds.length > 1 && accessInfo.cancanposttomygroups">
|
||||||
|
@ -66,17 +62,16 @@
|
||||||
<ion-label>{{ 'addon.mod_forum.discussionpinned' | translate }}</ion-label>
|
<ion-label>{{ 'addon.mod_forum.discussionpinned' | translate }}</ion-label>
|
||||||
<ion-toggle [(ngModel)]="newDiscussion.pin" name="pin"></ion-toggle>
|
<ion-toggle [(ngModel)]="newDiscussion.pin" name="pin"></ion-toggle>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<core-attachments *ngIf="canCreateAttachments && forum && forum.maxattachments > 0"
|
<core-attachments *ngIf="canCreateAttachments && forum && forum.maxattachments > 0" [files]="newDiscussion.files"
|
||||||
[files]="newDiscussion.files" [maxSize]="forum.maxbytes" [maxSubmissions]="forum.maxattachments"
|
[maxSize]="forum.maxbytes" [maxSubmissions]="forum.maxattachments" [component]="component" [componentId]="forum.cmid"
|
||||||
[component]="component" [componentId]="forum.cmid" [allowOffline]="true" [courseId]="courseId">
|
[allowOffline]="true" [courseId]="courseId">
|
||||||
</core-attachments>
|
</core-attachments>
|
||||||
</div>
|
</div>
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<ion-row>
|
<ion-row>
|
||||||
<ion-col>
|
<ion-col>
|
||||||
<ion-button
|
<ion-button expand="block" [disabled]="newDiscussion.subject == '' || newDiscussion.message == null"
|
||||||
expand="block" [disabled]="newDiscussion.subject == '' || newDiscussion.message == null"
|
|
||||||
(click)="add()">
|
(click)="add()">
|
||||||
{{ 'addon.mod_forum.posttoforum' | translate }}
|
{{ 'addon.mod_forum.posttoforum' | translate }}
|
||||||
</ion-button>
|
</ion-button>
|
||||||
|
|
|
@ -3,10 +3,12 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1 *ngIf="glossary">
|
<h1 *ngIf="glossary">
|
||||||
<core-format-text [text]="glossary.name" contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId">
|
<core-format-text [text]="glossary.name" contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</h1>
|
</h1>
|
||||||
|
</ion-title>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
</ion-header>
|
</ion-header>
|
||||||
<ion-content>
|
<ion-content>
|
||||||
|
@ -14,16 +16,15 @@
|
||||||
<form #editFormEl *ngIf="glossary">
|
<form #editFormEl *ngIf="glossary">
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-label position="stacked">{{ 'addon.mod_glossary.concept' | translate }}</ion-label>
|
<ion-label position="stacked">{{ 'addon.mod_glossary.concept' | translate }}</ion-label>
|
||||||
<ion-input type="text" [placeholder]="'addon.mod_glossary.concept' | translate" [(ngModel)]="entry.concept"
|
<ion-input type="text" [placeholder]="'addon.mod_glossary.concept' | translate" [(ngModel)]="entry.concept" name="concept">
|
||||||
name="concept">
|
|
||||||
</ion-input>
|
</ion-input>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-label position="stacked">{{ 'addon.mod_glossary.definition' | translate }}</ion-label>
|
<ion-label position="stacked">{{ 'addon.mod_glossary.definition' | translate }}</ion-label>
|
||||||
<core-rich-text-editor [control]="definitionControl" (contentChanged)="onDefinitionChange($event)"
|
<core-rich-text-editor [control]="definitionControl" (contentChanged)="onDefinitionChange($event)"
|
||||||
[placeholder]="'addon.mod_glossary.definition' | translate" name="addon_mod_glossary_edit"
|
[placeholder]="'addon.mod_glossary.definition' | translate" name="addon_mod_glossary_edit" [component]="component"
|
||||||
[component]="component" [componentId]="cmId" [autoSave]="true" contextLevel="module"
|
[componentId]="cmId" [autoSave]="true" contextLevel="module" [contextInstanceId]="cmId" elementId="definition_editor"
|
||||||
[contextInstanceId]="cmId" elementId="definition_editor" [draftExtraParams]="editorExtraParams">
|
[draftExtraParams]="editorExtraParams">
|
||||||
</core-rich-text-editor>
|
</core-rich-text-editor>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ion-item *ngIf="categories.length > 0">
|
<ion-item *ngIf="categories.length > 0">
|
||||||
|
@ -47,14 +48,18 @@
|
||||||
</ion-textarea>
|
</ion-textarea>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ion-item-divider>
|
<ion-item-divider>
|
||||||
<ion-label><h2>{{ 'addon.mod_glossary.attachment' | translate }}</h2></ion-label>
|
<ion-label>
|
||||||
|
<h2>{{ 'addon.mod_glossary.attachment' | translate }}</h2>
|
||||||
|
</ion-label>
|
||||||
</ion-item-divider>
|
</ion-item-divider>
|
||||||
<core-attachments [files]="attachments" [component]="component" [componentId]="glossary.coursemodule"
|
<core-attachments [files]="attachments" [component]="component" [componentId]="glossary.coursemodule" [allowOffline]="true"
|
||||||
[allowOffline]="true" [courseId]="courseId">
|
[courseId]="courseId">
|
||||||
</core-attachments>
|
</core-attachments>
|
||||||
<ng-container *ngIf="glossary.usedynalink">
|
<ng-container *ngIf="glossary.usedynalink">
|
||||||
<ion-item-divider>
|
<ion-item-divider>
|
||||||
<ion-label><h2>{{ 'addon.mod_glossary.linking' | translate }}</h2></ion-label>
|
<ion-label>
|
||||||
|
<h2>{{ 'addon.mod_glossary.linking' | translate }}</h2>
|
||||||
|
</ion-label>
|
||||||
</ion-item-divider>
|
</ion-item-divider>
|
||||||
<ion-item class="ion-text-wrap">
|
<ion-item class="ion-text-wrap">
|
||||||
<ion-label>{{ 'addon.mod_glossary.entryusedynalink' | translate }}</ion-label>
|
<ion-label>{{ 'addon.mod_glossary.entryusedynalink' | translate }}</ion-label>
|
||||||
|
|
|
@ -3,10 +3,12 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1 *ngIf="entry">
|
<h1 *ngIf="entry">
|
||||||
<core-format-text [text]="entry.concept" contextLevel="module" [contextInstanceId]="componentId" [courseId]="courseId">
|
<core-format-text [text]="entry.concept" contextLevel="module" [contextInstanceId]="componentId" [courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</h1>
|
</h1>
|
||||||
|
</ion-title>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
</ion-header>
|
</ion-header>
|
||||||
<ion-content>
|
<ion-content>
|
||||||
|
@ -39,14 +41,13 @@
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ion-item class="ion-text-wrap">
|
<ion-item class="ion-text-wrap">
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<core-format-text [component]="component" [componentId]="componentId" [text]="entry.definition"
|
<core-format-text [component]="component" [componentId]="componentId" [text]="entry.definition" contextLevel="module"
|
||||||
contextLevel="module" [contextInstanceId]="componentId" [courseId]="courseId">
|
[contextInstanceId]="componentId" [courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<div *ngIf="entry.attachment" lines="none">
|
<div *ngIf="entry.attachment" lines="none">
|
||||||
<core-file *ngFor="let file of entry.attachments" [file]="file" [component]="component"
|
<core-file *ngFor="let file of entry.attachments" [file]="file" [component]="component" [componentId]="componentId">
|
||||||
[componentId]="componentId">
|
|
||||||
</core-file>
|
</core-file>
|
||||||
</div>
|
</div>
|
||||||
<ion-item class="ion-text-wrap" *ngIf="tagsEnabled && entry && entry.tags && entry.tags.length > 0">
|
<ion-item class="ion-text-wrap" *ngIf="tagsEnabled && entry && entry.tags && entry.tags.length > 0">
|
||||||
|
@ -56,20 +57,21 @@
|
||||||
</ion-label>
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ion-item class="ion-text-wrap" *ngIf="!entry.approved">
|
<ion-item class="ion-text-wrap" *ngIf="!entry.approved">
|
||||||
<ion-label><p><em>{{ 'addon.mod_glossary.entrypendingapproval' | translate }}</em></p></ion-label>
|
<ion-label>
|
||||||
|
<p><em>{{ 'addon.mod_glossary.entrypendingapproval' | translate }}</em></p>
|
||||||
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<core-comments *ngIf="glossary && glossary.allowcomments && entry && entry.id > 0 && commentsEnabled"
|
<core-comments *ngIf="glossary && glossary.allowcomments && entry && entry.id > 0 && commentsEnabled" contextLevel="module"
|
||||||
contextLevel="module" [instanceId]="glossary.coursemodule" component="mod_glossary"
|
[instanceId]="glossary.coursemodule" component="mod_glossary" [itemId]="entry.id" area="glossary_entry"
|
||||||
[itemId]="entry.id" area="glossary_entry" [courseId]="glossary.course" [showItem]="true">
|
[courseId]="glossary.course" [showItem]="true">
|
||||||
</core-comments>
|
</core-comments>
|
||||||
<core-rating-rate *ngIf="glossary && ratingInfo" [ratingInfo]="ratingInfo" contextLevel="module"
|
<core-rating-rate *ngIf="glossary && ratingInfo" [ratingInfo]="ratingInfo" contextLevel="module"
|
||||||
[instanceId]="glossary.coursemodule" [itemId]="entry.id" [itemSetId]="0" [courseId]="glossary.course"
|
[instanceId]="glossary.coursemodule" [itemId]="entry.id" [itemSetId]="0" [courseId]="glossary.course"
|
||||||
[aggregateMethod]="glossary.assessed" [scaleId]="glossary.scale" [userId]="entry.userid"
|
[aggregateMethod]="glossary.assessed" [scaleId]="glossary.scale" [userId]="entry.userid" (onUpdate)="ratingUpdated()">
|
||||||
(onUpdate)="ratingUpdated()">
|
|
||||||
</core-rating-rate>
|
</core-rating-rate>
|
||||||
<core-rating-aggregate *ngIf="glossary && ratingInfo" [ratingInfo]="ratingInfo" contextLevel="module"
|
<core-rating-aggregate *ngIf="glossary && ratingInfo" [ratingInfo]="ratingInfo" contextLevel="module"
|
||||||
[instanceId]="glossary.coursemodule" [itemId]="entry.id" [courseId]="glossary.course"
|
[instanceId]="glossary.coursemodule" [itemId]="entry.id" [courseId]="glossary.course" [aggregateMethod]="glossary.assessed"
|
||||||
[aggregateMethod]="glossary.assessed" [scaleId]="glossary.scale">
|
[scaleId]="glossary.scale">
|
||||||
</core-rating-aggregate>
|
</core-rating-aggregate>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
|
|
|
@ -3,10 +3,12 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>
|
<h1>
|
||||||
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId">
|
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</h1>
|
</h1>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<!-- The buttons defined by the component will be added in here. -->
|
<!-- The buttons defined by the component will be added in here. -->
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
|
|
@ -3,11 +3,13 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>
|
<h1>
|
||||||
<core-format-text *ngIf="h5pActivity" [text]="h5pActivity.name" contextLevel="module"
|
<core-format-text *ngIf="h5pActivity" [text]="h5pActivity.name" contextLevel="module"
|
||||||
[contextInstanceId]="h5pActivity.coursemodule" [courseId]="courseId">
|
[contextInstanceId]="h5pActivity.coursemodule" [courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</h1>
|
</h1>
|
||||||
|
</ion-title>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
</ion-header>
|
</ion-header>
|
||||||
<ion-content>
|
<ion-content>
|
||||||
|
@ -89,15 +91,15 @@
|
||||||
<ion-card *ngFor="let result of attempt.results">
|
<ion-card *ngFor="let result of attempt.results">
|
||||||
<ion-card-header class="ion-text-wrap">
|
<ion-card-header class="ion-text-wrap">
|
||||||
<ion-card-title>
|
<ion-card-title>
|
||||||
<core-format-text [text]="result.description" [component]="component" [componentId]="cmId"
|
<core-format-text [text]="result.description" [component]="component" [componentId]="cmId" contextLevel="module"
|
||||||
contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId">
|
[contextInstanceId]="cmId" [courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</ion-card-title>
|
</ion-card-title>
|
||||||
</ion-card-header>
|
</ion-card-header>
|
||||||
<ion-item *ngIf="result.content" class="ion-text-wrap">
|
<ion-item *ngIf="result.content" class="ion-text-wrap">
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<core-format-text [text]="result.content" [component]="component" [componentId]="cmId"
|
<core-format-text [text]="result.content" [component]="component" [componentId]="cmId" contextLevel="module"
|
||||||
contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId">
|
[contextInstanceId]="cmId" [courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
@ -113,8 +115,7 @@
|
||||||
</ion-row>
|
</ion-row>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ion-item *ngFor="let option of result.options"
|
<ion-item *ngFor="let option of result.options" class="ion-text-wrap addon-mod_h5pactivity-result-table-row">
|
||||||
class="ion-text-wrap addon-mod_h5pactivity-result-table-row">
|
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<ion-row class="ion-align-items-center">
|
<ion-row class="ion-align-items-center">
|
||||||
<ion-col class="ion-text-center">
|
<ion-col class="ion-text-center">
|
||||||
|
@ -124,8 +125,7 @@
|
||||||
</ion-col>
|
</ion-col>
|
||||||
<ion-col class="ion-text-center">
|
<ion-col class="ion-text-center">
|
||||||
<ng-container *ngIf="option.correctanswer">
|
<ng-container *ngIf="option.correctanswer">
|
||||||
<ng-container
|
<ng-container *ngTemplateOutlet="answerTemplate; context: {answer: option.correctanswer}">
|
||||||
*ngTemplateOutlet="answerTemplate; context: {answer: option.correctanswer}">
|
|
||||||
</ng-container>
|
</ng-container>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
</ion-col>
|
</ion-col>
|
||||||
|
|
|
@ -3,10 +3,12 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>
|
<h1>
|
||||||
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId">
|
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</h1>
|
</h1>
|
||||||
|
</ion-title>
|
||||||
|
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<!-- The buttons defined by the component will be added in here. -->
|
<!-- The buttons defined by the component will be added in here. -->
|
||||||
|
|
|
@ -3,11 +3,13 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>
|
<h1>
|
||||||
<core-format-text *ngIf="h5pActivity" [text]="h5pActivity.name" contextLevel="module"
|
<core-format-text *ngIf="h5pActivity" [text]="h5pActivity.name" contextLevel="module"
|
||||||
[contextInstanceId]="h5pActivity.coursemodule" [courseId]="courseId">
|
[contextInstanceId]="h5pActivity.coursemodule" [courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</h1>
|
</h1>
|
||||||
|
</ion-title>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
</ion-header>
|
</ion-header>
|
||||||
<ion-content>
|
<ion-content>
|
||||||
|
|
|
@ -3,11 +3,13 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>
|
<h1>
|
||||||
<core-format-text *ngIf="h5pActivity" [text]="h5pActivity.name" contextLevel="module"
|
<core-format-text *ngIf="h5pActivity" [text]="h5pActivity.name" contextLevel="module"
|
||||||
[contextInstanceId]="h5pActivity.coursemodule" [courseId]="courseId">
|
[contextInstanceId]="h5pActivity.coursemodule" [courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</h1>
|
</h1>
|
||||||
|
</ion-title>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
</ion-header>
|
</ion-header>
|
||||||
<ion-content>
|
<ion-content>
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
<ion-header>
|
<ion-header>
|
||||||
<ion-toolbar>
|
<ion-toolbar>
|
||||||
<h1>{{ 'addon.mod_imscp.toc' | translate }}</h1>
|
<ion-title>
|
||||||
|
<h2>{{ 'addon.mod_imscp.toc' | translate }}</h2>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
<ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
||||||
<ion-icon name="fas-times" slot="icon-only" aria-hidden=true></ion-icon>
|
<ion-icon name="fas-times" slot="icon-only" aria-hidden=true></ion-icon>
|
||||||
|
|
|
@ -3,10 +3,12 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>
|
<h1>
|
||||||
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId">
|
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</h1>
|
</h1>
|
||||||
|
</ion-title>
|
||||||
|
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<!-- The buttons defined by the component will be added in here. -->
|
<!-- The buttons defined by the component will be added in here. -->
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
<ion-header>
|
<ion-header>
|
||||||
<ion-toolbar>
|
<ion-toolbar>
|
||||||
|
<ion-title>
|
||||||
<h2>{{ pageInstance?.lesson?.name }}</h2>
|
<h2>{{ pageInstance?.lesson?.name }}</h2>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
<ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
||||||
<ion-icon slot="icon-only" name="fas-times" aria-hidden="true"></ion-icon>
|
<ion-icon slot="icon-only" name="fas-times" aria-hidden="true"></ion-icon>
|
||||||
|
@ -15,7 +16,9 @@
|
||||||
<!-- Media file. -->
|
<!-- Media file. -->
|
||||||
<ng-container *ngIf="pageInstance.mediaFile">
|
<ng-container *ngIf="pageInstance.mediaFile">
|
||||||
<ion-item-divider>
|
<ion-item-divider>
|
||||||
<ion-label><h2>{{ 'addon.mod_lesson.linkedmedia' | translate }}</h2></ion-label>
|
<ion-label>
|
||||||
|
<h2>{{ 'addon.mod_lesson.linkedmedia' | translate }}</h2>
|
||||||
|
</ion-label>
|
||||||
</ion-item-divider>
|
</ion-item-divider>
|
||||||
<core-file [file]="pageInstance.mediaFile" [component]="pageInstance.component"
|
<core-file [file]="pageInstance.mediaFile" [component]="pageInstance.component"
|
||||||
[componentId]="pageInstance.lesson?.coursemodule">
|
[componentId]="pageInstance.lesson?.coursemodule">
|
||||||
|
@ -25,16 +28,20 @@
|
||||||
<!-- Lesson menu. -->
|
<!-- Lesson menu. -->
|
||||||
<ng-container *ngIf="pageInstance.displayMenu">
|
<ng-container *ngIf="pageInstance.displayMenu">
|
||||||
<ion-item-divider>
|
<ion-item-divider>
|
||||||
<ion-label><h2>{{ 'addon.mod_lesson.lessonmenu' | translate }}</h2></ion-label>
|
<ion-label>
|
||||||
|
<h2>{{ 'addon.mod_lesson.lessonmenu' | translate }}</h2>
|
||||||
|
</ion-label>
|
||||||
</ion-item-divider>
|
</ion-item-divider>
|
||||||
<ion-item class="ion-text-center" *ngIf="pageInstance.loadingMenu">
|
<ion-item class="ion-text-center" *ngIf="pageInstance.loadingMenu">
|
||||||
<ion-label><ion-spinner [attr.aria-label]="'core.loading' | translate"></ion-spinner></ion-label>
|
<ion-label>
|
||||||
|
<ion-spinner [attr.aria-label]="'core.loading' | translate"></ion-spinner>
|
||||||
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<div *ngIf="!pageInstance.loadingMenu">
|
<div *ngIf="!pageInstance.loadingMenu">
|
||||||
<ng-container *ngFor="let page of pageInstance.lessonPages">
|
<ng-container *ngFor="let page of pageInstance.lessonPages">
|
||||||
<ion-item class="ion-text-wrap" *ngIf="page.display && page.displayinmenublock" (click)="loadPage(page.id)"
|
<ion-item class="ion-text-wrap" *ngIf="page.display && page.displayinmenublock" (click)="loadPage(page.id)"
|
||||||
[attr.aria-current]="!pageInstance.eolData && pageInstance.currentPage == page.id ? 'page' : 'false'"
|
[attr.aria-current]="!pageInstance.eolData && pageInstance.currentPage == page.id ? 'page' : 'false'" button
|
||||||
button detail="true">
|
detail="true">
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<core-format-text [text]="page.title" contextLevel="module" [courseId]="pageInstance.courseId"
|
<core-format-text [text]="page.title" contextLevel="module" [courseId]="pageInstance.courseId"
|
||||||
[contextInstanceId]="pageInstance.lesson?.coursemodule">
|
[contextInstanceId]="pageInstance.lesson?.coursemodule">
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
<ion-header>
|
<ion-header>
|
||||||
<ion-toolbar>
|
<ion-toolbar>
|
||||||
|
<ion-title>
|
||||||
<h2>{{ 'core.login.password' | translate }}</h2>
|
<h2>{{ 'core.login.password' | translate }}</h2>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
<ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
||||||
<ion-icon slot="icon-only" name="fas-times" aria-hidden="true"></ion-icon>
|
<ion-icon slot="icon-only" name="fas-times" aria-hidden="true"></ion-icon>
|
||||||
|
@ -14,8 +15,8 @@
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-label>{{ 'addon.mod_lesson.enterpassword' | translate }}</ion-label>
|
<ion-label>{{ 'addon.mod_lesson.enterpassword' | translate }}</ion-label>
|
||||||
<core-show-password name="password">
|
<core-show-password name="password">
|
||||||
<ion-input name="password" type="password" placeholder="{{ 'core.login.password' | translate }}"
|
<ion-input name="password" type="password" placeholder="{{ 'core.login.password' | translate }}" core-auto-focus
|
||||||
core-auto-focus #passwordinput [clearOnEdit]="false">
|
#passwordinput [clearOnEdit]="false">
|
||||||
</ion-input>
|
</ion-input>
|
||||||
</core-show-password>
|
</core-show-password>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
|
|
@ -3,10 +3,12 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>
|
<h1>
|
||||||
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId">
|
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</h1>
|
</h1>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<!-- The buttons defined by the component will be added in here. -->
|
<!-- The buttons defined by the component will be added in here. -->
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
|
|
@ -3,11 +3,12 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>
|
<h1>
|
||||||
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="lesson?.coursemodule"
|
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="lesson?.coursemodule" [courseId]="courseId">
|
||||||
[courseId]="courseId">
|
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</h1>
|
</h1>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button fill="clear" *ngIf="displayMenu || mediaFile" [attr.aria-label]="'addon.mod_lesson.lessonmenu' | translate"
|
<ion-button fill="clear" *ngIf="displayMenu || mediaFile" [attr.aria-label]="'addon.mod_lesson.lessonmenu' | translate"
|
||||||
(click)="showMenu()">
|
(click)="showMenu()">
|
||||||
|
@ -46,15 +47,14 @@
|
||||||
<ion-card *ngIf="!eolData && !processData">
|
<ion-card *ngIf="!eolData && !processData">
|
||||||
<!-- Content page. -->
|
<!-- Content page. -->
|
||||||
<ion-item class="ion-text-wrap" *ngIf="!question && pageContent">
|
<ion-item class="ion-text-wrap" *ngIf="!question && pageContent">
|
||||||
<core-format-text [component]="component" [componentId]="lesson.coursemodule" [text]="pageContent"
|
<core-format-text [component]="component" [componentId]="lesson.coursemodule" [text]="pageContent" contextLevel="module"
|
||||||
contextLevel="module" [contextInstanceId]="lesson.coursemodule" [courseId]="courseId">
|
[contextInstanceId]="lesson.coursemodule" [courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
|
||||||
<!-- Question page. -->
|
<!-- Question page. -->
|
||||||
<!-- We need to set ngIf loaded to make formGroup directive restart every time a page changes, see MOBILE-2540. -->
|
<!-- We need to set ngIf loaded to make formGroup directive restart every time a page changes, see MOBILE-2540. -->
|
||||||
<form *ngIf="question && loaded" [formGroup]="questionForm" #questionFormEl
|
<form *ngIf="question && loaded" [formGroup]="questionForm" #questionFormEl (ngSubmit)="submitQuestion($event)">
|
||||||
(ngSubmit)="submitQuestion($event)">
|
|
||||||
|
|
||||||
<ion-item-divider class="ion-text-wrap" *ngIf="pageContent">
|
<ion-item-divider class="ion-text-wrap" *ngIf="pageContent">
|
||||||
<ion-label>
|
<ion-label>
|
||||||
|
@ -91,8 +91,8 @@
|
||||||
<h3 class="item-heading">{{ 'addon.mod_lesson.youranswer' | translate }}</h3>
|
<h3 class="item-heading">{{ 'addon.mod_lesson.youranswer' | translate }}</h3>
|
||||||
<p>
|
<p>
|
||||||
<core-format-text [component]="component" [componentId]="lesson?.coursemodule"
|
<core-format-text [component]="component" [componentId]="lesson?.coursemodule"
|
||||||
[text]="question.useranswer" contextLevel="module"
|
[text]="question.useranswer" contextLevel="module" [contextInstanceId]="lesson?.coursemodule"
|
||||||
[contextInstanceId]="lesson?.coursemodule" [courseId]="courseId">
|
[courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</p>
|
</p>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
|
@ -105,9 +105,8 @@
|
||||||
<ion-radio-group *ngIf="!question.multi" [formControlName]="question.controlName">
|
<ion-radio-group *ngIf="!question.multi" [formControlName]="question.controlName">
|
||||||
<ion-item class="ion-text-wrap" *ngFor="let option of question.options">
|
<ion-item class="ion-text-wrap" *ngFor="let option of question.options">
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<core-format-text [component]="component" [componentId]="lesson.coursemodule"
|
<core-format-text [component]="component" [componentId]="lesson.coursemodule" [text]="option.text"
|
||||||
[text]="option.text" contextLevel="module" [contextInstanceId]="lesson?.coursemodule"
|
contextLevel="module" [contextInstanceId]="lesson?.coursemodule" [courseId]="courseId">
|
||||||
[courseId]="courseId">
|
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
<ion-radio slot="end" [id]="option.id" [value]="option.value" [disabled]="option.disabled">
|
<ion-radio slot="end" [id]="option.id" [value]="option.value" [disabled]="option.disabled">
|
||||||
|
@ -119,9 +118,8 @@
|
||||||
<ng-container *ngIf="question.multi">
|
<ng-container *ngIf="question.multi">
|
||||||
<ion-item class="ion-text-wrap" *ngFor="let option of question.options">
|
<ion-item class="ion-text-wrap" *ngFor="let option of question.options">
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<core-format-text [component]="component" [componentId]="lesson?.coursemodule"
|
<core-format-text [component]="component" [componentId]="lesson?.coursemodule" [text]="option.text"
|
||||||
[text]="option.text" contextLevel="module" [contextInstanceId]="lesson?.coursemodule"
|
contextLevel="module" [contextInstanceId]="lesson?.coursemodule" [courseId]="courseId">
|
||||||
[courseId]="courseId">
|
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
<ion-checkbox [id]="option.id" [formControlName]="option.name" slot="end"></ion-checkbox>
|
<ion-checkbox [id]="option.id" [formControlName]="option.name" slot="end"></ion-checkbox>
|
||||||
|
@ -133,10 +131,12 @@
|
||||||
<ng-container *ngSwitchCase="'matching'">
|
<ng-container *ngSwitchCase="'matching'">
|
||||||
<ion-item class="ion-text-wrap" *ngFor="let row of question.rows">
|
<ion-item class="ion-text-wrap" *ngFor="let row of question.rows">
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<p><core-format-text id="addon-mod_lesson-matching-{{row.id}}" [component]="component"
|
<p>
|
||||||
|
<core-format-text id="addon-mod_lesson-matching-{{row.id}}" [component]="component"
|
||||||
[componentId]="lesson?.coursemodule" [text]="row.text" contextLevel="module"
|
[componentId]="lesson?.coursemodule" [text]="row.text" contextLevel="module"
|
||||||
[contextInstanceId]="lesson?.coursemodule" [courseId]="courseId">
|
[contextInstanceId]="lesson?.coursemodule" [courseId]="courseId">
|
||||||
</core-format-text></p>
|
</core-format-text>
|
||||||
|
</p>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
<ion-select [id]="row.id" [formControlName]="row.name" interface="action-sheet"
|
<ion-select [id]="row.id" [formControlName]="row.name" interface="action-sheet"
|
||||||
[attr.aria-labelledby]="'addon-mod_lesson-matching-' + row.id">
|
[attr.aria-labelledby]="'addon-mod_lesson-matching-' + row.id">
|
||||||
|
@ -161,8 +161,8 @@
|
||||||
<ion-grid *ngIf="pageButtons?.length" class="ion-text-wrap addon-mod_lesson-pagebuttons">
|
<ion-grid *ngIf="pageButtons?.length" class="ion-text-wrap addon-mod_lesson-pagebuttons">
|
||||||
<ion-row class="ion-align-items-center">
|
<ion-row class="ion-align-items-center">
|
||||||
<ion-col *ngFor="let button of pageButtons" size="12" size-md="6" size-lg="3" col-xl>
|
<ion-col *ngFor="let button of pageButtons" size="12" size-md="6" size-lg="3" col-xl>
|
||||||
<ion-button expand="block" fill="outline" [id]="button.id"
|
<ion-button expand="block" fill="outline" [id]="button.id" (click)="buttonClicked(button.data)"
|
||||||
(click)="buttonClicked(button.data)" class="ion-text-wrap button-no-uppercase">
|
class="ion-text-wrap button-no-uppercase">
|
||||||
{{ button.content }}
|
{{ button.content }}
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-col>
|
</ion-col>
|
||||||
|
@ -213,8 +213,7 @@
|
||||||
<ion-item class="ion-text-wrap" *ngIf="eolData.displayscorewithessays" lines="none">
|
<ion-item class="ion-text-wrap" *ngIf="eolData.displayscorewithessays" lines="none">
|
||||||
<ion-label [innerHTML]="eolData.displayscorewithessays.message"></ion-label>
|
<ion-label [innerHTML]="eolData.displayscorewithessays.message"></ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ion-item class="ion-text-wrap" *ngIf="!eolData.displayscorewithessays && eolData.displayscorewithoutessays"
|
<ion-item class="ion-text-wrap" *ngIf="!eolData.displayscorewithessays && eolData.displayscorewithoutessays" lines="none">
|
||||||
lines="none">
|
|
||||||
<ion-label>{{ eolData.displayscorewithoutessays.message }}</ion-label>
|
<ion-label>{{ eolData.displayscorewithoutessays.message }}</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ion-item class="ion-text-wrap" *ngIf="eolData.yourcurrentgradeisoutof" lines="none">
|
<ion-item class="ion-text-wrap" *ngIf="eolData.yourcurrentgradeisoutof" lines="none">
|
||||||
|
@ -247,19 +246,17 @@
|
||||||
<ion-label>{{ eolData.modattemptsnoteacher.message }}</ion-label>
|
<ion-label>{{ eolData.modattemptsnoteacher.message }}</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<!-- If activity link was successfully formatted, render the button. -->
|
<!-- If activity link was successfully formatted, render the button. -->
|
||||||
<ion-button *ngIf="activityLink && activityLink.formatted"
|
<ion-button *ngIf="activityLink && activityLink.formatted" expand="block" color="light" [href]="activityLink.href" core-link
|
||||||
expand="block" color="light" [href]="activityLink.href" core-link [capture]="true"
|
[capture]="true" class="ion-text-wrap ion-margin button-no-uppercase">
|
||||||
class="ion-text-wrap ion-margin button-no-uppercase">
|
<core-format-text [text]="activityLink.label" contextLevel="module" [contextInstanceId]="lesson?.coursemodule"
|
||||||
<core-format-text [text]="activityLink.label" contextLevel="module"
|
[courseId]="courseId">
|
||||||
[contextInstanceId]="lesson?.coursemodule" [courseId]="courseId">
|
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
<ion-item class="ion-text-wrap" *ngIf="activityLink && !activityLink.formatted"
|
<ion-item class="ion-text-wrap" *ngIf="activityLink && !activityLink.formatted" lines="none">
|
||||||
lines="none">
|
|
||||||
<!-- Activity link wasn't formatted, render the original link. -->
|
<!-- Activity link wasn't formatted, render the original link. -->
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<core-format-text [text]="activityLink.label" contextLevel="module"
|
<core-format-text [text]="activityLink.label" contextLevel="module" [contextInstanceId]="lesson?.coursemodule"
|
||||||
[contextInstanceId]="lesson?.coursemodule" [courseId]="courseId">
|
[courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
@ -273,9 +270,8 @@
|
||||||
<ion-item class="ion-text-wrap" *ngIf="!processData.reviewmode || review">
|
<ion-item class="ion-text-wrap" *ngIf="!processData.reviewmode || review">
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<div *ngIf="!processData.reviewmode">
|
<div *ngIf="!processData.reviewmode">
|
||||||
<core-format-text [component]="component" [componentId]="lesson?.coursemodule"
|
<core-format-text [component]="component" [componentId]="lesson?.coursemodule" [text]="processData.feedback"
|
||||||
[text]="processData.feedback" contextLevel="module" [contextInstanceId]="lesson?.coursemodule"
|
contextLevel="module" [contextInstanceId]="lesson?.coursemodule" [courseId]="courseId">
|
||||||
[courseId]="courseId">
|
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</div>
|
</div>
|
||||||
<div *ngIf="review">
|
<div *ngIf="review">
|
||||||
|
@ -286,8 +282,7 @@
|
||||||
</ion-label>
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
|
||||||
<ion-button expand="block" class="ion-text-wrap ion-margin" color="light" *ngIf="review"
|
<ion-button expand="block" class="ion-text-wrap ion-margin" color="light" *ngIf="review" (click)="changePage(LESSON_EOL)">
|
||||||
(click)="changePage(LESSON_EOL)">
|
|
||||||
{{ 'addon.mod_lesson.finish' | translate }}
|
{{ 'addon.mod_lesson.finish' | translate }}
|
||||||
</ion-button>
|
</ion-button>
|
||||||
<ion-button expand="block" class="ion-text-wrap ion-margin" color="light" *ngFor="let button of processDataButtons"
|
<ion-button expand="block" class="ion-text-wrap ion-margin" color="light" *ngFor="let button of processDataButtons"
|
||||||
|
|
|
@ -3,7 +3,9 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>{{ 'addon.mod_lesson.detailedstats' | translate }}</h1>
|
<h1>{{ 'addon.mod_lesson.detailedstats' | translate }}</h1>
|
||||||
|
</ion-title>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
</ion-header>
|
</ion-header>
|
||||||
<ion-content>
|
<ion-content>
|
||||||
|
@ -133,8 +135,8 @@
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<p>
|
<p>
|
||||||
<core-format-text [component]="component" [componentId]="lesson?.coursemodule"
|
<core-format-text [component]="component" [componentId]="lesson?.coursemodule"
|
||||||
[text]="answer[0].content" contextLevel="module"
|
[text]="answer[0].content" contextLevel="module" [contextInstanceId]="lesson?.coursemodule"
|
||||||
[contextInstanceId]="lesson?.coursemodule" [courseId]="courseId">
|
[courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</p>
|
</p>
|
||||||
<ion-badge *ngIf="answer[1]" color="dark">
|
<ion-badge *ngIf="answer[1]" color="dark">
|
||||||
|
@ -144,8 +146,7 @@
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</ion-badge>
|
</ion-badge>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
<ion-checkbox [attr.name]="answer[0].name" [ngModel]="answer[0].checked" [disabled]="true"
|
<ion-checkbox [attr.name]="answer[0].name" [ngModel]="answer[0].checked" [disabled]="true" slot="end">
|
||||||
slot="end">
|
|
||||||
</ion-checkbox>
|
</ion-checkbox>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
|
||||||
|
@ -213,15 +214,13 @@
|
||||||
<!-- Another page (end of branch, ...). -->
|
<!-- Another page (end of branch, ...). -->
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<p>
|
<p>
|
||||||
<core-format-text [component]="component" [componentId]="lesson?.coursemodule"
|
<core-format-text [component]="component" [componentId]="lesson?.coursemodule" [text]="answer[0]"
|
||||||
[text]="answer[0]" contextLevel="module" [contextInstanceId]="lesson?.coursemodule"
|
contextLevel="module" [contextInstanceId]="lesson?.coursemodule" [courseId]="courseId">
|
||||||
[courseId]="courseId">
|
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</p>
|
</p>
|
||||||
<ion-badge *ngIf="answer[1]" color="dark">
|
<ion-badge *ngIf="answer[1]" color="dark">
|
||||||
<core-format-text [component]="component" [componentId]="lesson?.coursemodule"
|
<core-format-text [component]="component" [componentId]="lesson?.coursemodule" [text]="answer[1]"
|
||||||
[text]="answer[1]" contextLevel="module" [contextInstanceId]="lesson?.coursemodule"
|
contextLevel="module" [contextInstanceId]="lesson?.coursemodule" [courseId]="courseId">
|
||||||
[courseId]="courseId">
|
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</ion-badge>
|
</ion-badge>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
|
@ -233,14 +232,16 @@
|
||||||
<h3 class="item-heading">{{ 'addon.mod_lesson.response' | translate }}</h3>
|
<h3 class="item-heading">{{ 'addon.mod_lesson.response' | translate }}</h3>
|
||||||
<p>
|
<p>
|
||||||
<core-format-text [component]="component" [componentId]="lesson?.coursemodule"
|
<core-format-text [component]="component" [componentId]="lesson?.coursemodule"
|
||||||
[text]="page.answerdata.response" contextLevel="module"
|
[text]="page.answerdata.response" contextLevel="module" [contextInstanceId]="lesson?.coursemodule"
|
||||||
[contextInstanceId]="lesson?.coursemodule" [courseId]="courseId">
|
[courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</p>
|
</p>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ion-item class="ion-text-wrap" *ngIf="page.answerdata.score">
|
<ion-item class="ion-text-wrap" *ngIf="page.answerdata.score">
|
||||||
<ion-label><p>{{page.answerdata.score}}</p></ion-label>
|
<ion-label>
|
||||||
|
<p>{{page.answerdata.score}}</p>
|
||||||
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</div>
|
</div>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
|
|
@ -3,10 +3,12 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>
|
<h1>
|
||||||
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId">
|
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</h1>
|
</h1>
|
||||||
|
</ion-title>
|
||||||
|
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<!-- The buttons defined by the component will be added in here. -->
|
<!-- The buttons defined by the component will be added in here. -->
|
||||||
|
|
|
@ -3,10 +3,12 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>
|
<h1>
|
||||||
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId">
|
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</h1>
|
</h1>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<!-- The buttons defined by the component will be added in here. -->
|
<!-- The buttons defined by the component will be added in here. -->
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
<ion-header>
|
<ion-header>
|
||||||
<ion-toolbar>
|
<ion-toolbar>
|
||||||
|
<ion-title>
|
||||||
<h2>{{ 'addon.mod_quiz.quiznavigation' | translate }}</h2>
|
<h2>{{ 'addon.mod_quiz.quiznavigation' | translate }}</h2>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
<ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
||||||
<ion-icon slot="icon-only" name="fas-times" aria-hidden="true"></ion-icon>
|
<ion-icon slot="icon-only" name="fas-times" aria-hidden="true"></ion-icon>
|
||||||
|
@ -41,12 +42,12 @@
|
||||||
<ion-icon *ngIf="question.stateClass == 'core-question-correct'" name="fas-check" color="success"
|
<ion-icon *ngIf="question.stateClass == 'core-question-correct'" name="fas-check" color="success"
|
||||||
[attr.aria-label]="question.status" slot="end">
|
[attr.aria-label]="question.status" slot="end">
|
||||||
</ion-icon>
|
</ion-icon>
|
||||||
<ion-icon *ngIf="question.stateClass == 'core-question-partiallycorrect'" name="fas-check-square"
|
<ion-icon *ngIf="question.stateClass == 'core-question-partiallycorrect'" name="fas-check-square" color="warning"
|
||||||
color="warning" [attr.aria-label]="question.status" slot="end">
|
[attr.aria-label]="question.status" slot="end">
|
||||||
</ion-icon>
|
</ion-icon>
|
||||||
<ion-icon *ngIf="question.stateClass == 'core-question-incorrect' ||
|
<ion-icon *ngIf="question.stateClass == 'core-question-incorrect' ||
|
||||||
question.stateClass == 'core-question-notanswered'" name="fas-times" color="danger"
|
question.stateClass == 'core-question-notanswered'" name="fas-times" color="danger" [attr.aria-label]="question.status"
|
||||||
[attr.aria-label]="question.status" slot="end">
|
slot="end">
|
||||||
</ion-icon>
|
</ion-icon>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
<ion-header>
|
<ion-header>
|
||||||
<ion-toolbar>
|
<ion-toolbar>
|
||||||
|
<ion-title>
|
||||||
<h2>{{ title | translate }}</h2>
|
<h2>{{ title | translate }}</h2>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
<ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
||||||
<ion-icon slot="icon-only" name="fas-times" aria-hidden="true"></ion-icon>
|
<ion-icon slot="icon-only" name="fas-times" aria-hidden="true"></ion-icon>
|
||||||
|
|
|
@ -3,11 +3,13 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>
|
<h1>
|
||||||
<core-format-text *ngIf="quiz" [text]="quiz.name" contextLevel="module" [contextInstanceId]="quiz.coursemodule"
|
<core-format-text *ngIf="quiz" [text]="quiz.name" contextLevel="module" [contextInstanceId]="quiz.coursemodule"
|
||||||
[courseId]="courseId">
|
[courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</h1>
|
</h1>
|
||||||
|
</ion-title>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
</ion-header>
|
</ion-header>
|
||||||
<ion-content>
|
<ion-content>
|
||||||
|
@ -45,8 +47,8 @@
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<h2>{{ 'addon.mod_quiz.feedback' | translate }}</h2>
|
<h2>{{ 'addon.mod_quiz.feedback' | translate }}</h2>
|
||||||
<p>
|
<p>
|
||||||
<core-format-text [component]="component" [componentId]="componentId" [text]="feedback"
|
<core-format-text [component]="component" [componentId]="componentId" [text]="feedback" contextLevel="module"
|
||||||
contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId">
|
[contextInstanceId]="cmId" [courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</p>
|
</p>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
|
|
|
@ -3,10 +3,12 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>
|
<h1>
|
||||||
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId">
|
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</h1>
|
</h1>
|
||||||
|
</ion-title>
|
||||||
|
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<!-- The buttons defined by the component will be added in here. -->
|
<!-- The buttons defined by the component will be added in here. -->
|
||||||
|
|
|
@ -3,11 +3,13 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>
|
<h1>
|
||||||
<core-format-text *ngIf="quiz" [text]="quiz.name" contextLevel="module" [contextInstanceId]="quiz.coursemodule"
|
<core-format-text *ngIf="quiz" [text]="quiz.name" contextLevel="module" [contextInstanceId]="quiz.coursemodule"
|
||||||
[courseId]="courseId">
|
[courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</h1>
|
</h1>
|
||||||
|
</ion-title>
|
||||||
|
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button fill="clear" id="addon-mod_quiz-connection-error-button" [hidden]="!autoSaveError"
|
<ion-button fill="clear" id="addon-mod_quiz-connection-error-button" [hidden]="!autoSaveError"
|
||||||
|
@ -15,8 +17,7 @@
|
||||||
aria-haspopup="dialog">
|
aria-haspopup="dialog">
|
||||||
<ion-icon name="fas-exclamation-circle" slot="icon-only" aria-hidden="true"></ion-icon>
|
<ion-icon name="fas-exclamation-circle" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
<ion-button *ngIf="navigation.length" [attr.aria-label]="'addon.mod_quiz.opentoc' | translate"
|
<ion-button *ngIf="navigation.length" [attr.aria-label]="'addon.mod_quiz.opentoc' | translate" (click)="openNavigation()">
|
||||||
(click)="openNavigation()">
|
|
||||||
<ion-icon name="fas-bookmark" slot="icon-only" aria-hidden="true"></ion-icon>
|
<ion-icon name="fas-bookmark" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
@ -24,8 +25,7 @@
|
||||||
<!-- Navigation arrows and time left. -->
|
<!-- Navigation arrows and time left. -->
|
||||||
<ion-toolbar *ngIf="loaded && endTime && questions.length && !quizAborted && !showSummary" color="light">
|
<ion-toolbar *ngIf="loaded && endTime && questions.length && !quizAborted && !showSummary" color="light">
|
||||||
<ion-title>
|
<ion-title>
|
||||||
<core-timer [endTime]="endTime" (finished)="timeUp()" [timerText]="'addon.mod_quiz.timeleft' | translate"
|
<core-timer [endTime]="endTime" (finished)="timeUp()" [timerText]="'addon.mod_quiz.timeleft' | translate" [align]="'center'">
|
||||||
[align]="'center'">
|
|
||||||
</core-timer>
|
</core-timer>
|
||||||
</ion-title>
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
|
@ -79,10 +79,9 @@
|
||||||
</ion-item-divider>
|
</ion-item-divider>
|
||||||
|
|
||||||
<!-- Body of the question. -->
|
<!-- Body of the question. -->
|
||||||
<core-question class="ion-text-wrap" [question]="question" [component]="component"
|
<core-question class="ion-text-wrap" [question]="question" [component]="component" [componentId]="cmId"
|
||||||
[componentId]="cmId" [attemptId]="attempt!.id" [usageId]="attempt!.uniqueid"
|
[attemptId]="attempt!.id" [usageId]="attempt!.uniqueid" [offlineEnabled]="offline" contextLevel="module"
|
||||||
[offlineEnabled]="offline" contextLevel="module" [contextInstanceId]="cmId"
|
[contextInstanceId]="cmId" [courseId]="courseId" [preferredBehaviour]="quiz!.preferredbehaviour" [review]="false"
|
||||||
[courseId]="courseId" [preferredBehaviour]="quiz!.preferredbehaviour" [review]="false"
|
|
||||||
(onAbort)="abortQuiz()" (buttonClicked)="behaviourButtonClicked($event)">
|
(onAbort)="abortQuiz()" (buttonClicked)="behaviourButtonClicked($event)">
|
||||||
</core-question>
|
</core-question>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
@ -131,8 +130,8 @@
|
||||||
<!-- List of questions of the summary table. -->
|
<!-- List of questions of the summary table. -->
|
||||||
<ng-container *ngFor="let question of summaryQuestions">
|
<ng-container *ngFor="let question of summaryQuestions">
|
||||||
<ion-item *ngIf="question.number" (click)="changePage(question.page, false, question.slot)"
|
<ion-item *ngIf="question.number" (click)="changePage(question.page, false, question.slot)"
|
||||||
[attr.aria-label]="'core.question.questionno' | translate:{$a: question.number}"
|
[attr.aria-label]="'core.question.questionno' | translate:{$a: question.number}" [detail]="!isSequential && canReturn"
|
||||||
[detail]="!isSequential && canReturn" [button]="!isSequential && canReturn">
|
[button]="!isSequential && canReturn">
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<ion-row class="ion-align-items-center">
|
<ion-row class="ion-align-items-center">
|
||||||
<ion-col size="3" class="ion-text-center">{{ question.number }}</ion-col>
|
<ion-col size="3" class="ion-text-center">{{ question.number }}</ion-col>
|
||||||
|
@ -153,8 +152,7 @@
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
|
||||||
<!-- Time left (if quiz is timed). -->
|
<!-- Time left (if quiz is timed). -->
|
||||||
<core-timer *ngIf="endTime" [endTime]="endTime" (finished)="timeUp()"
|
<core-timer *ngIf="endTime" [endTime]="endTime" (finished)="timeUp()" [timerText]="'addon.mod_quiz.timeleft' | translate">
|
||||||
[timerText]="'addon.mod_quiz.timeleft' | translate">
|
|
||||||
</core-timer>
|
</core-timer>
|
||||||
|
|
||||||
<!-- List of messages explaining why the quiz cannot be submitted. -->
|
<!-- List of messages explaining why the quiz cannot be submitted. -->
|
||||||
|
@ -165,15 +163,14 @@
|
||||||
</ion-label>
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
|
||||||
<ion-button *ngIf="preventSubmitMessages.length" expand="block" [href]="moduleUrl" core-link
|
<ion-button *ngIf="preventSubmitMessages.length" expand="block" [href]="moduleUrl" core-link [showBrowserWarning]="false">
|
||||||
[showBrowserWarning]="false">
|
|
||||||
{{ 'core.openinbrowser' | translate }}
|
{{ 'core.openinbrowser' | translate }}
|
||||||
<ion-icon name="fas-external-link-alt" slot="end" aria-hidden="true"></ion-icon>
|
<ion-icon name="fas-external-link-alt" slot="end" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
|
|
||||||
<!-- Button to submit the quiz. -->
|
<!-- Button to submit the quiz. -->
|
||||||
<ion-button *ngIf="!attempt!.finishedOffline && !preventSubmitMessages.length" expand="block"
|
<ion-button *ngIf="!attempt!.finishedOffline && !preventSubmitMessages.length" expand="block" class="ion-margin"
|
||||||
class="ion-margin" (click)="finishAttempt(true)">
|
(click)="finishAttempt(true)">
|
||||||
{{ 'addon.mod_quiz.submitallandfinish' | translate }}
|
{{ 'addon.mod_quiz.submitallandfinish' | translate }}
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
|
|
@ -3,7 +3,9 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>{{ 'addon.mod_quiz.review' | translate }}</h1>
|
<h1>{{ 'addon.mod_quiz.review' | translate }}</h1>
|
||||||
|
</ion-title>
|
||||||
|
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button fill="clear" *ngIf="navigation.length" [attr.aria-label]="'addon.mod_quiz.opentoc' | translate"
|
<ion-button fill="clear" *ngIf="navigation.length" [attr.aria-label]="'addon.mod_quiz.opentoc' | translate"
|
||||||
|
@ -75,8 +77,8 @@
|
||||||
<ion-item class="ion-text-wrap" *ngFor="let data of additionalData">
|
<ion-item class="ion-text-wrap" *ngFor="let data of additionalData">
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<p class="item-heading">{{ data.title }}</p>
|
<p class="item-heading">{{ data.title }}</p>
|
||||||
<core-format-text [component]="component" [componentId]="cmId" [text]="data.content"
|
<core-format-text [component]="component" [componentId]="cmId" [text]="data.content" contextLevel="module"
|
||||||
contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId">
|
[contextInstanceId]="cmId" [courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
@ -107,8 +109,7 @@
|
||||||
<!-- Body of the question. -->
|
<!-- Body of the question. -->
|
||||||
<core-question class="ion-text-wrap" [question]="question" [component]="component" [componentId]="cmId"
|
<core-question class="ion-text-wrap" [question]="question" [component]="component" [componentId]="cmId"
|
||||||
[attemptId]="attempt.id" [usageId]="attempt.uniqueid" [offlineEnabled]="false" contextLevel="module"
|
[attemptId]="attempt.id" [usageId]="attempt.uniqueid" [offlineEnabled]="false" contextLevel="module"
|
||||||
[contextInstanceId]="cmId" [courseId]="courseId" [review]="true"
|
[contextInstanceId]="cmId" [courseId]="courseId" [review]="true" [preferredBehaviour]="quiz?.preferredbehaviour">
|
||||||
[preferredBehaviour]="quiz?.preferredbehaviour">
|
|
||||||
</core-question>
|
</core-question>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
</div>
|
</div>
|
||||||
|
@ -130,8 +131,7 @@
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-col>
|
</ion-col>
|
||||||
<ion-col class="ion-text-end">
|
<ion-col class="ion-text-end">
|
||||||
<ion-button color="light" *ngIf="nextPage >= -1" (click)="changePage(nextPage)"
|
<ion-button color="light" *ngIf="nextPage >= -1" (click)="changePage(nextPage)" [attr.aria-label]="'core.next' | translate">
|
||||||
[attr.aria-label]="'core.next' | translate">
|
|
||||||
<ion-icon name="fas-chevron-right" slot="icon-only" aria-hidden="true"></ion-icon>
|
<ion-icon name="fas-chevron-right" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-col>
|
</ion-col>
|
||||||
|
|
|
@ -3,10 +3,12 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>
|
<h1>
|
||||||
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId">
|
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</h1>
|
</h1>
|
||||||
|
</ion-title>
|
||||||
|
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<!-- The buttons defined by the component will be added in here. -->
|
<!-- The buttons defined by the component will be added in here. -->
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
<ion-header>
|
<ion-header>
|
||||||
<ion-toolbar>
|
<ion-toolbar>
|
||||||
<h1>{{ 'addon.mod_scorm.toc' | translate }}</h1>
|
<ion-title>
|
||||||
|
<h2>{{ 'addon.mod_scorm.toc' | translate }}</h2>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
<ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
||||||
<ion-icon slot="icon-only" name="fas-times" aria-hidden="true"></ion-icon>
|
<ion-icon slot="icon-only" name="fas-times" aria-hidden="true"></ion-icon>
|
||||||
|
@ -36,8 +38,7 @@
|
||||||
<ion-icon *ngIf="sco.icon" [name]="sco.icon.icon" [attr.aria-label]="sco.icon.description" slot="start">
|
<ion-icon *ngIf="sco.icon" [name]="sco.icon.icon" [attr.aria-label]="sco.icon.description" slot="start">
|
||||||
</ion-icon>
|
</ion-icon>
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<core-format-text [text]="sco.title" contextLevel="module" [contextInstanceId]="moduleId"
|
<core-format-text [text]="sco.title" contextLevel="module" [contextInstanceId]="moduleId" [courseId]="courseId">
|
||||||
[courseId]="courseId">
|
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
<span *ngIf="accessInfo && accessInfo.canviewscores && sco.scoreraw">
|
<span *ngIf="accessInfo && accessInfo.canviewscores && sco.scoreraw">
|
||||||
({{ 'addon.mod_scorm.score' | translate }}: {{sco.scoreraw}})
|
({{ 'addon.mod_scorm.score' | translate }}: {{sco.scoreraw}})
|
||||||
|
|
|
@ -3,10 +3,12 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>
|
<h1>
|
||||||
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId">
|
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</h1>
|
</h1>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<!-- The buttons defined by the component will be added in here. -->
|
<!-- The buttons defined by the component will be added in here. -->
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
|
|
@ -3,14 +3,16 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>
|
<h1>
|
||||||
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId">
|
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</h1>
|
</h1>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<core-button-with-spinner *ngIf="showToc" [loading]="loadingToc">
|
<core-button-with-spinner *ngIf="showToc" [loading]="loadingToc">
|
||||||
<ion-button fill="clear" *ngIf="toc.length" (click)="openToc()"
|
<ion-button fill="clear" *ngIf="toc.length" (click)="openToc()" [attr.aria-label]="'addon.mod_scorm.toc' | translate"
|
||||||
[attr.aria-label]="'addon.mod_scorm.toc' | translate" aria-haspopup="true">
|
aria-haspopup="true">
|
||||||
<ion-icon name="fas-bookmark" slot="icon-only" aria-hidden="true"></ion-icon>
|
<ion-icon name="fas-bookmark" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</core-button-with-spinner>
|
</core-button-with-spinner>
|
||||||
|
|
|
@ -3,9 +3,11 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>
|
<h1>
|
||||||
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module.id"></core-format-text>
|
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module.id"></core-format-text>
|
||||||
</h1>
|
</h1>
|
||||||
|
</ion-title>
|
||||||
|
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<!-- The buttons defined by the component will be added in here. -->
|
<!-- The buttons defined by the component will be added in here. -->
|
||||||
|
|
|
@ -3,9 +3,11 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>
|
<h1>
|
||||||
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id"></core-format-text>
|
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id"></core-format-text>
|
||||||
</h1>
|
</h1>
|
||||||
|
</ion-title>
|
||||||
|
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<!-- The buttons defined by the component will be added in here. -->
|
<!-- The buttons defined by the component will be added in here. -->
|
||||||
|
|
|
@ -50,13 +50,13 @@
|
||||||
<!-- Activity info. -->
|
<!-- Activity info. -->
|
||||||
<core-course-module-info [module]="module" (completionChanged)="onCompletionChange()" [description]="description"
|
<core-course-module-info [module]="module" (completionChanged)="onCompletionChange()" [description]="description"
|
||||||
[component]="component" [componentId]="componentId" [courseId]="courseId">
|
[component]="component" [componentId]="componentId" [courseId]="courseId">
|
||||||
<h3 *ngIf="pageTitle" title>{{pageTitle}}</h3>
|
<h2 *ngIf="pageTitle" title>{{pageTitle}}</h2>
|
||||||
</core-course-module-info>
|
</core-course-module-info>
|
||||||
|
|
||||||
<div *ngIf="pageIsOffline || hasOffline || pageWarning">
|
<div *ngIf="pageIsOffline || hasOffline || pageWarning">
|
||||||
<!-- Wiki has something offline. -->
|
<!-- Wiki has something offline. -->
|
||||||
<ion-card class="core-warning-card" *ngIf="pageIsOffline || hasOffline">
|
<ion-card class="core-warning-card" *ngIf="pageIsOffline || hasOffline">
|
||||||
<ion-item>
|
<ion-item class="ion-text-wrap">
|
||||||
<ion-icon name="fas-exclamation-triangle" slot="start" aria-hidden="true"></ion-icon>
|
<ion-icon name="fas-exclamation-triangle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<span *ngIf="pageIsOffline">{{ 'core.hasdatatosync' | translate:{$a: pageStr} }}</span>
|
<span *ngIf="pageIsOffline">{{ 'core.hasdatatosync' | translate:{$a: pageStr} }}</span>
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
<ion-header>
|
<ion-header>
|
||||||
<ion-toolbar>
|
<ion-toolbar>
|
||||||
<h1>{{ 'addon.mod_wiki.map' | translate }}</h1>
|
<ion-title>
|
||||||
|
<h2>{{ 'addon.mod_wiki.map' | translate }}</h2>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
<ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
||||||
<ion-icon slot="icon-only" name="fas-times" aria-hidden="true"></ion-icon>
|
<ion-icon slot="icon-only" name="fas-times" aria-hidden="true"></ion-icon>
|
||||||
|
@ -18,14 +20,15 @@
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ng-container *ngFor="let letter of map">
|
<ng-container *ngFor="let letter of map">
|
||||||
<ion-item-divider *ngIf="letter.label">
|
<ion-item-divider *ngIf="letter.label">
|
||||||
<ion-label><h2>{{ letter.label }}</h2></ion-label>
|
<ion-label>
|
||||||
|
<h2>{{ letter.label }}</h2>
|
||||||
|
</ion-label>
|
||||||
</ion-item-divider>
|
</ion-item-divider>
|
||||||
<ion-item class="ion-text-wrap" *ngFor="let page of letter.pages" (click)="goToPage(page)"
|
<ion-item class="ion-text-wrap" *ngFor="let page of letter.pages" (click)="goToPage(page)"
|
||||||
[attr.aria-current]="selectedTitle == page.title ? 'page' : 'false'" button detail="false">
|
[attr.aria-current]="selectedTitle == page.title ? 'page' : 'false'" button detail="false">
|
||||||
<ion-icon name="fas-home" slot="start" *ngIf="page.firstpage" aria-hidden="true"></ion-icon>
|
<ion-icon name="fas-home" slot="start" *ngIf="page.firstpage" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<core-format-text [text]="page.title" contextLevel="module" [contextInstanceId]="moduleId"
|
<core-format-text [text]="page.title" contextLevel="module" [contextInstanceId]="moduleId" [courseId]="courseId">
|
||||||
[courseId]="courseId">
|
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
<ion-note *ngIf="!page.id" slot="end">
|
<ion-note *ngIf="!page.id" slot="end">
|
||||||
|
|
|
@ -3,10 +3,12 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>
|
<h1>
|
||||||
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId">
|
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</h1>
|
</h1>
|
||||||
|
</ion-title>
|
||||||
|
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button fill="clear" (click)="save()">
|
<ion-button fill="clear" (click)="save()">
|
||||||
|
@ -20,16 +22,15 @@
|
||||||
<form [formGroup]="pageForm" #editPageForm *ngIf="loaded">
|
<form [formGroup]="pageForm" #editPageForm *ngIf="loaded">
|
||||||
<ion-item class="ion-text-wrap" *ngIf="canEditTitle">
|
<ion-item class="ion-text-wrap" *ngIf="canEditTitle">
|
||||||
<ion-label class="sr-only">{{ 'addon.mod_wiki.newpagetitle' | translate }}</ion-label>
|
<ion-label class="sr-only">{{ 'addon.mod_wiki.newpagetitle' | translate }}</ion-label>
|
||||||
<ion-input name="title" type="text" [placeholder]="'addon.mod_wiki.newpagetitle' | translate"
|
<ion-input name="title" type="text" [placeholder]="'addon.mod_wiki.newpagetitle' | translate" formControlName="title">
|
||||||
formControlName="title">
|
|
||||||
</ion-input>
|
</ion-input>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-label class="sr-only">{{ 'core.content' | translate }}</ion-label>
|
<ion-label class="sr-only">{{ 'core.content' | translate }}</ion-label>
|
||||||
<core-rich-text-editor [control]="contentControl" [placeholder]="'core.content' | translate"
|
<core-rich-text-editor [control]="contentControl" [placeholder]="'core.content' | translate" name="wiki_page_content"
|
||||||
name="wiki_page_content" [component]="component" [componentId]="cmId" [autoSave]="true" contextLevel="module"
|
[component]="component" [componentId]="cmId" [autoSave]="true" contextLevel="module" [contextInstanceId]="cmId"
|
||||||
[contextInstanceId]="cmId" elementId="newcontent_editor" [draftExtraParams]="editorExtraParams">
|
elementId="newcontent_editor" [draftExtraParams]="editorExtraParams">
|
||||||
</core-rich-text-editor>
|
</core-rich-text-editor>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
|
||||||
|
|
|
@ -3,14 +3,16 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>
|
<h1>
|
||||||
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId">
|
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</h1>
|
</h1>
|
||||||
<p>
|
<h2>
|
||||||
<core-format-text [text]="pageTitle" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId">
|
<core-format-text [text]="pageTitle" contextLevel="module" [contextInstanceId]="module?.id" [courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</p>
|
</h2>
|
||||||
|
</ion-title>
|
||||||
|
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<!-- The buttons defined by the component will be added in here. -->
|
<!-- The buttons defined by the component will be added in here. -->
|
||||||
|
|
|
@ -1,9 +1,8 @@
|
||||||
<ion-header>
|
<ion-header>
|
||||||
<ion-toolbar>
|
<ion-toolbar>
|
||||||
<ion-buttons slot="start">
|
<ion-title>
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
|
||||||
</ion-buttons>
|
|
||||||
<h2>{{ 'addon.mod_workshop.userplan' | translate }}</h2>
|
<h2>{{ 'addon.mod_workshop.userplan' | translate }}</h2>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
<ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
||||||
<ion-icon name="fas-times" slot="icon-only" aria-hidden=true></ion-icon>
|
<ion-icon name="fas-times" slot="icon-only" aria-hidden=true></ion-icon>
|
||||||
|
@ -30,8 +29,8 @@
|
||||||
<ion-icon slot="end" name="fas-external-link-alt" aria-hidden="true"></ion-icon>
|
<ion-icon slot="end" name="fas-external-link-alt" aria-hidden="true"></ion-icon>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ion-item class="ion-text-wrap" *ngFor="let task of phase.tasks"
|
<ion-item class="ion-text-wrap" *ngFor="let task of phase.tasks"
|
||||||
[class.item-dimmed]="phase.code != workshopPhase || (task.code == 'submit' && !showSubmit)"
|
[class.item-dimmed]="phase.code != workshopPhase || (task.code == 'submit' && !showSubmit)" (click)="runTask(task)"
|
||||||
(click)="runTask(task)" detail="false" button>
|
detail="false" button>
|
||||||
<ion-icon slot="start" name="far-circle" *ngIf="task.completed == null"
|
<ion-icon slot="start" name="far-circle" *ngIf="task.completed == null"
|
||||||
[attr.aria-label]="'addon.mod_workshop.tasktodo' | translate"></ion-icon>
|
[attr.aria-label]="'addon.mod_workshop.tasktodo' | translate"></ion-icon>
|
||||||
<ion-icon slot="start" name="fas-times-circle" color="danger" *ngIf="task.completed == ''"
|
<ion-icon slot="start" name="fas-times-circle" color="danger" *ngIf="task.completed == ''"
|
||||||
|
|
|
@ -3,11 +3,13 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>
|
<h1>
|
||||||
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="workshop && workshop.coursemodule"
|
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="workshop && workshop.coursemodule"
|
||||||
[courseId]="courseId">
|
[courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</h1>
|
</h1>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end" [hidden]="!evaluating">
|
<ion-buttons slot="end" [hidden]="!evaluating">
|
||||||
<ion-button fill="clear" (click)="saveEvaluation()">
|
<ion-button fill="clear" (click)="saveEvaluation()">
|
||||||
{{ 'core.save' | translate }}
|
{{ 'core.save' | translate }}
|
||||||
|
@ -48,14 +50,15 @@
|
||||||
</ion-label>
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
|
||||||
<addon-mod-workshop-assessment-strategy
|
<addon-mod-workshop-assessment-strategy *ngIf="assessment && assessmentId && showGrade(assessment.grade) && workshop && access"
|
||||||
*ngIf="assessment && assessmentId && showGrade(assessment.grade) && workshop && access" [workshop]="workshop"
|
[workshop]="workshop" [access]="access" [assessmentId]="assessmentId" [userId]="profile && profile.id" [strategy]="strategy">
|
||||||
[access]="access" [assessmentId]="assessmentId" [userId]="profile && profile.id" [strategy]="strategy">
|
|
||||||
</addon-mod-workshop-assessment-strategy>
|
</addon-mod-workshop-assessment-strategy>
|
||||||
|
|
||||||
<form [formGroup]="evaluateForm" *ngIf="evaluating" #evaluateFormEl>
|
<form [formGroup]="evaluateForm" *ngIf="evaluating" #evaluateFormEl>
|
||||||
<ion-item class="ion-text-wrap">
|
<ion-item class="ion-text-wrap">
|
||||||
<ion-label><h2>{{ 'addon.mod_workshop.assessmentsettings' | translate }}</h2></ion-label>
|
<ion-label>
|
||||||
|
<h2>{{ 'addon.mod_workshop.assessmentsettings' | translate }}</h2>
|
||||||
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ion-item class="ion-text-wrap" *ngIf="access?.canallocate">
|
<ion-item class="ion-text-wrap" *ngIf="access?.canallocate">
|
||||||
<ion-label position="stacked">
|
<ion-label position="stacked">
|
||||||
|
@ -85,16 +88,16 @@
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ion-item *ngIf="access?.canoverridegrades">
|
<ion-item *ngIf="access?.canoverridegrades">
|
||||||
<ion-label position="stacked">{{ 'addon.mod_workshop.feedbackreviewer' | translate }}</ion-label>
|
<ion-label position="stacked">{{ 'addon.mod_workshop.feedbackreviewer' | translate }}</ion-label>
|
||||||
<core-rich-text-editor [control]="evaluateForm.controls['text']" name="text"
|
<core-rich-text-editor [control]="evaluateForm.controls['text']" name="text" [autoSave]="true" contextLevel="module"
|
||||||
[autoSave]="true" contextLevel="module" [contextInstanceId]="workshop?.coursemodule"
|
[contextInstanceId]="workshop?.coursemodule" elementId="feedbackreviewer_editor"
|
||||||
elementId="feedbackreviewer_editor" [draftExtraParams]="{asid: assessmentId}">
|
[draftExtraParams]="{asid: assessmentId}">
|
||||||
</core-rich-text-editor>
|
</core-rich-text-editor>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</form>
|
</form>
|
||||||
<ion-list *ngIf="!evaluating && evaluate && evaluate.text">
|
<ion-list *ngIf="!evaluating && evaluate && evaluate.text">
|
||||||
<ion-item class="ion-text-wrap">
|
<ion-item class="ion-text-wrap">
|
||||||
<core-user-avatar *ngIf="evaluateByProfile" [user]="evaluateByProfile" slot="start"
|
<core-user-avatar *ngIf="evaluateByProfile" [user]="evaluateByProfile" slot="start" [courseId]="courseId"
|
||||||
[courseId]="courseId" [userId]="evaluateByProfile.id"></core-user-avatar>
|
[userId]="evaluateByProfile.id"></core-user-avatar>
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<h2 *ngIf="evaluateByProfile && evaluateByProfile.fullname">
|
<h2 *ngIf="evaluateByProfile && evaluateByProfile.fullname">
|
||||||
{{ 'addon.mod_workshop.feedbackby' | translate : {$a: evaluateByProfile.fullname} }}
|
{{ 'addon.mod_workshop.feedbackby' | translate : {$a: evaluateByProfile.fullname} }}
|
||||||
|
|
|
@ -3,7 +3,9 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>{{ 'addon.mod_workshop.editsubmission' | translate }}</h1>
|
<h1>{{ 'addon.mod_workshop.editsubmission' | translate }}</h1>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button fill="clear" (click)="save()" [attr.aria-label]="'core.save' | translate">
|
<ion-button fill="clear" (click)="save()" [attr.aria-label]="'core.save' | translate">
|
||||||
{{ 'core.save' | translate }}
|
{{ 'core.save' | translate }}
|
||||||
|
@ -38,9 +40,8 @@
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
|
||||||
<core-attachments *ngIf="fileAvailable" [files]="attachments" [maxSize]="workshop.maxbytes"
|
<core-attachments *ngIf="fileAvailable" [files]="attachments" [maxSize]="workshop.maxbytes"
|
||||||
[maxSubmissions]="workshop.nattachments" [component]="component" [componentId]="workshop.coursemodule"
|
[maxSubmissions]="workshop.nattachments" [component]="component" [componentId]="workshop.coursemodule" allowOffline="true"
|
||||||
allowOffline="true" [acceptedTypes]="workshop.submissionfiletypes" [required]="fileRequired"
|
[acceptedTypes]="workshop.submissionfiletypes" [required]="fileRequired" [courseId]="workshop.course">
|
||||||
[courseId]="workshop.course">
|
|
||||||
</core-attachments>
|
</core-attachments>
|
||||||
</form>
|
</form>
|
||||||
</core-loading>
|
</core-loading>
|
||||||
|
|
|
@ -3,10 +3,12 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>
|
<h1>
|
||||||
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId">
|
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</h1>
|
</h1>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<!-- The buttons defined by the component will be added in here. -->
|
<!-- The buttons defined by the component will be added in here. -->
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
|
|
@ -3,10 +3,12 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>
|
<h1>
|
||||||
<core-format-text *ngIf="title" [text]="title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId">
|
<core-format-text *ngIf="title" [text]="title" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</h1>
|
</h1>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end" [hidden]="!loaded">
|
<ion-buttons slot="end" [hidden]="!loaded">
|
||||||
<ion-button *ngIf="assessmentId && access.assessingallowed" fill="clear" (click)="saveAssessment()"
|
<ion-button *ngIf="assessmentId && access.assessingallowed" fill="clear" (click)="saveAssessment()"
|
||||||
[attr.aria-label]="'core.save' | translate">
|
[attr.aria-label]="'core.save' | translate">
|
||||||
|
@ -55,8 +57,7 @@
|
||||||
<h2 *ngIf="evaluateByProfile && evaluateByProfile.fullname">
|
<h2 *ngIf="evaluateByProfile && evaluateByProfile.fullname">
|
||||||
{{ 'addon.mod_workshop.feedbackby' | translate : {$a: evaluateByProfile.fullname} }}
|
{{ 'addon.mod_workshop.feedbackby' | translate : {$a: evaluateByProfile.fullname} }}
|
||||||
</h2>
|
</h2>
|
||||||
<core-format-text [text]="evaluate?.text" contextLevel="module" [contextInstanceId]="module.id"
|
<core-format-text [text]="evaluate?.text" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId">
|
||||||
[courseId]="courseId">
|
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
@ -68,8 +69,8 @@
|
||||||
<h2>{{ 'addon.mod_workshop.yourassessment' | translate }}</h2>
|
<h2>{{ 'addon.mod_workshop.yourassessment' | translate }}</h2>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<addon-mod-workshop-assessment [submission]="submission" [assessment]="ownAssessment" [courseId]="courseId"
|
<addon-mod-workshop-assessment [submission]="submission" [assessment]="ownAssessment" [courseId]="courseId" [access]="access"
|
||||||
[access]="access" [module]="module" [workshop]="workshop">
|
[module]="module" [workshop]="workshop">
|
||||||
</addon-mod-workshop-assessment>
|
</addon-mod-workshop-assessment>
|
||||||
</ion-list>
|
</ion-list>
|
||||||
|
|
||||||
|
@ -92,8 +93,8 @@
|
||||||
<h2>{{ 'addon.mod_workshop.givengrades' | translate }}</h2>
|
<h2>{{ 'addon.mod_workshop.givengrades' | translate }}</h2>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<addon-mod-workshop-assessment *ngFor="let reviewer of submissionInfo.reviewerof" [assessment]="reviewer"
|
<addon-mod-workshop-assessment *ngFor="let reviewer of submissionInfo.reviewerof" [assessment]="reviewer" [courseId]="courseId"
|
||||||
[courseId]="courseId" [module]="module" [workshop]="workshop" [access]="access">
|
[module]="module" [workshop]="workshop" [access]="access">
|
||||||
</addon-mod-workshop-assessment>
|
</addon-mod-workshop-assessment>
|
||||||
</ion-list>
|
</ion-list>
|
||||||
|
|
||||||
|
@ -126,21 +127,20 @@
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-label position="stacked">{{ 'addon.mod_workshop.feedbackauthor' | translate }}</ion-label>
|
<ion-label position="stacked">{{ 'addon.mod_workshop.feedbackauthor' | translate }}</ion-label>
|
||||||
<core-rich-text-editor [control]="feedbackForm.controls['text']" name="text"
|
<core-rich-text-editor [control]="feedbackForm.controls['text']" name="text" [autoSave]="true" contextLevel="module"
|
||||||
[autoSave]="true" contextLevel="module" [contextInstanceId]="module.id" elementId="feedbackauthor_editor"
|
[contextInstanceId]="module.id" elementId="feedbackauthor_editor" [draftExtraParams]="{id: submissionId}">
|
||||||
[draftExtraParams]="{id: submissionId}">
|
|
||||||
</core-rich-text-editor>
|
</core-rich-text-editor>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
<addon-mod-workshop-assessment-strategy *ngIf="assessmentId" [workshop]="workshop" [access]="access"
|
<addon-mod-workshop-assessment-strategy *ngIf="assessmentId" [workshop]="workshop" [access]="access" [assessmentId]="assessmentId"
|
||||||
[assessmentId]="assessmentId" [userId]="assessmentUserId" [strategy]="strategy" [edit]="access.assessingallowed">
|
[userId]="assessmentUserId" [strategy]="strategy" [edit]="access.assessingallowed">
|
||||||
</addon-mod-workshop-assessment-strategy>
|
</addon-mod-workshop-assessment-strategy>
|
||||||
|
|
||||||
<ion-list *ngIf="assessmentId && !access.assessingallowed && assessment?.feedbackreviewer">
|
<ion-list *ngIf="assessmentId && !access.assessingallowed && assessment?.feedbackreviewer">
|
||||||
<ion-item class="ion-text-wrap">
|
<ion-item class="ion-text-wrap">
|
||||||
<core-user-avatar *ngIf="evaluateGradingByProfile" [user]="evaluateGradingByProfile" slot="start"
|
<core-user-avatar *ngIf="evaluateGradingByProfile" [user]="evaluateGradingByProfile" slot="start" [courseId]="courseId"
|
||||||
[courseId]="courseId" [userId]="evaluateGradingByProfile.id"></core-user-avatar>
|
[userId]="evaluateGradingByProfile.id"></core-user-avatar>
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<h2 *ngIf="evaluateGradingByProfile && evaluateGradingByProfile.fullname">
|
<h2 *ngIf="evaluateGradingByProfile && evaluateGradingByProfile.fullname">
|
||||||
{{ 'addon.mod_workshop.feedbackby' | translate : {$a: evaluateGradingByProfile.fullname} }}
|
{{ 'addon.mod_workshop.feedbackby' | translate : {$a: evaluateGradingByProfile.fullname} }}
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
<ion-header>
|
<ion-header>
|
||||||
<ion-toolbar>
|
<ion-toolbar>
|
||||||
|
<ion-title>
|
||||||
<h2>{{ 'addon.notes.addnewnote' | translate }}</h2>
|
<h2>{{ 'addon.notes.addnewnote' | translate }}</h2>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
<ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
||||||
<ion-icon name="fas-times" slot="icon-only" aria-hidden=true></ion-icon>
|
<ion-icon name="fas-times" slot="icon-only" aria-hidden=true></ion-icon>
|
||||||
|
@ -20,8 +22,7 @@
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-label class="sr-only">{{ 'addon.notes.note' | translate }}</ion-label>
|
<ion-label class="sr-only">{{ 'addon.notes.note' | translate }}</ion-label>
|
||||||
<ion-textarea placeholder="{{ 'addon.notes.note' | translate }}" rows="5" [(ngModel)]="text" name="text"
|
<ion-textarea placeholder="{{ 'addon.notes.note' | translate }}" rows="5" [(ngModel)]="text" name="text" required="required">
|
||||||
required="required">
|
|
||||||
</ion-textarea>
|
</ion-textarea>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<div class="ion-padding">
|
<div class="ion-padding">
|
||||||
|
|
|
@ -4,7 +4,9 @@
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
|
||||||
|
<ion-title>
|
||||||
<h1>{{ 'addon.notes.notes' | translate }}</h1>
|
<h1>{{ 'addon.notes.notes' | translate }}</h1>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
|
@ -15,13 +17,12 @@
|
||||||
<ion-icon name="fas-pen" slot="icon-only" aria-hidden="true"></ion-icon>
|
<ion-icon name="fas-pen" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
<core-context-menu>
|
<core-context-menu>
|
||||||
<core-context-menu-item [hidden]="!(notesLoaded && !hasOffline)" [priority]="100"
|
<core-context-menu-item [hidden]="!(notesLoaded && !hasOffline)" [priority]="100" [content]="'core.refresh' | translate"
|
||||||
[content]="'core.refresh' | translate" (action)="refreshNotes(false)"
|
(action)="refreshNotes(false)" [iconAction]="refreshIcon" [closeOnClick]="true">
|
||||||
[iconAction]="refreshIcon" [closeOnClick]="true">
|
|
||||||
</core-context-menu-item>
|
</core-context-menu-item>
|
||||||
<core-context-menu-item [hidden]="!(notesLoaded && hasOffline)" [priority]="100"
|
<core-context-menu-item [hidden]="!(notesLoaded && hasOffline)" [priority]="100"
|
||||||
[content]="'core.settings.synchronizenow' | translate" (action)="refreshNotes(true)"
|
[content]="'core.settings.synchronizenow' | translate" (action)="refreshNotes(true)" [iconAction]="syncIcon"
|
||||||
[iconAction]="syncIcon" [closeOnClick]="false"></core-context-menu-item>
|
[closeOnClick]="false"></core-context-menu-item>
|
||||||
</core-context-menu>
|
</core-context-menu>
|
||||||
</core-navbar-buttons>
|
</core-navbar-buttons>
|
||||||
<ion-content>
|
<ion-content>
|
||||||
|
@ -32,7 +33,9 @@
|
||||||
<core-loading [hideUntil]="notesLoaded">
|
<core-loading [hideUntil]="notesLoaded">
|
||||||
<ion-item class="ion-text-wrap" *ngIf="user">
|
<ion-item class="ion-text-wrap" *ngIf="user">
|
||||||
<core-user-avatar [user]="user" [courseId]="courseId" slot="start" [linkProfile]="false"></core-user-avatar>
|
<core-user-avatar [user]="user" [courseId]="courseId" slot="start" [linkProfile]="false"></core-user-avatar>
|
||||||
<ion-label><h2>{{user!.fullname}}</h2></ion-label>
|
<ion-label>
|
||||||
|
<h2>{{user!.fullname}}</h2>
|
||||||
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
|
||||||
<core-combobox [selection]="type" (onChange)="typeChanged($event)">
|
<core-combobox [selection]="type" (onChange)="typeChanged($event)">
|
||||||
|
@ -83,14 +86,16 @@
|
||||||
[attr.aria-label]="'core.restore' | translate">
|
[attr.aria-label]="'core.restore' | translate">
|
||||||
<ion-icon name="fas-undo-alt" slot="icon-only" aria-hidden="true"></ion-icon>
|
<ion-icon name="fas-undo-alt" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
<ion-button *ngIf="showDelete && !note.deleted && (type != 'personal' || note.usermodified == currentUserId)"
|
<ion-button *ngIf="showDelete && !note.deleted && (type != 'personal' || note.usermodified == currentUserId)" slot="end"
|
||||||
slot="end" fill="clear" [@coreSlideInOut]="'fromRight'" color="danger" (click)="deleteNote($event, note)"
|
fill="clear" [@coreSlideInOut]="'fromRight'" color="danger" (click)="deleteNote($event, note)"
|
||||||
[attr.aria-label]="'core.delete' | translate">
|
[attr.aria-label]="'core.delete' | translate">
|
||||||
<ion-icon name="fas-trash" slot="icon-only" aria-hidden="true"></ion-icon>
|
<ion-icon name="fas-trash" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ion-item class="ion-text-wrap">
|
<ion-item class="ion-text-wrap">
|
||||||
<ion-label><core-format-text [text]="note.content" [filter]="false"></core-format-text></ion-label>
|
<ion-label>
|
||||||
|
<core-format-text [text]="note.content" [filter]="false"></core-format-text>
|
||||||
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
|
@ -3,7 +3,9 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>{{ 'addon.notifications.notifications' | translate }}</h1>
|
<h1>{{ 'addon.notifications.notifications' | translate }}</h1>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<core-user-menu-button></core-user-menu-button>
|
<core-user-menu-button></core-user-menu-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
@ -15,8 +17,7 @@
|
||||||
</ion-refresher>
|
</ion-refresher>
|
||||||
<core-loading [hideUntil]="notificationsLoaded">
|
<core-loading [hideUntil]="notificationsLoaded">
|
||||||
<div class="ion-padding" *ngIf="canMarkAllNotificationsAsRead">
|
<div class="ion-padding" *ngIf="canMarkAllNotificationsAsRead">
|
||||||
<ion-button [disabled]="loadingMarkAllNotificationsAsRead" expand="block" (click)="markAllNotificationsAsRead()"
|
<ion-button [disabled]="loadingMarkAllNotificationsAsRead" expand="block" (click)="markAllNotificationsAsRead()" color="light">
|
||||||
color="light">
|
|
||||||
<ion-icon slot="start" name="fas-check" aria-hidden="true" *ngIf="!loadingMarkAllNotificationsAsRead"></ion-icon>
|
<ion-icon slot="start" name="fas-check" aria-hidden="true" *ngIf="!loadingMarkAllNotificationsAsRead"></ion-icon>
|
||||||
<ion-spinner slot="start" [attr.aria-label]="'core.loading' | translate" *ngIf="loadingMarkAllNotificationsAsRead">
|
<ion-spinner slot="start" [attr.aria-label]="'core.loading' | translate" *ngIf="loadingMarkAllNotificationsAsRead">
|
||||||
</ion-spinner>
|
</ion-spinner>
|
||||||
|
@ -25,8 +26,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<ion-card *ngFor="let notification of notifications">
|
<ion-card *ngFor="let notification of notifications">
|
||||||
<ion-item class="ion-text-wrap" lines="none"
|
<ion-item class="ion-text-wrap" lines="none" [attr.aria-label]="
|
||||||
[attr.aria-label]="
|
|
||||||
notification.timeread
|
notification.timeread
|
||||||
? notification.subject
|
? notification.subject
|
||||||
: 'addon.notifications.unreadnotification' | translate: {$a: notification.subject}">
|
: 'addon.notifications.unreadnotification' | translate: {$a: notification.subject}">
|
||||||
|
@ -34,8 +34,8 @@
|
||||||
[profileUrl]="notification.profileimageurlfrom" [fullname]="notification.userfromfullname"
|
[profileUrl]="notification.profileimageurlfrom" [fullname]="notification.userfromfullname"
|
||||||
[userId]="notification.useridfrom" [extraIcon]="notification.iconurl"></core-user-avatar>
|
[userId]="notification.useridfrom" [extraIcon]="notification.iconurl"></core-user-avatar>
|
||||||
|
|
||||||
<img *ngIf="notification.useridfrom <= 0 && notification.iconurl" [src]="notification.iconurl" alt=""
|
<img *ngIf="notification.useridfrom <= 0 && notification.iconurl" [src]="notification.iconurl" alt="" role="presentation"
|
||||||
role="presentation" class="core-notification-icon" slot="start">
|
class="core-notification-icon" slot="start">
|
||||||
|
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<p class="item-heading">{{ notification.subject }}</p>
|
<p class="item-heading">{{ notification.subject }}</p>
|
||||||
|
@ -50,8 +50,8 @@
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ion-item class="ion-text-wrap">
|
<ion-item class="ion-text-wrap">
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<core-format-text [text]="notification.mobiletext | coreCreateLinks" contextLevel="system"
|
<core-format-text [text]="notification.mobiletext | coreCreateLinks" contextLevel="system" [contextInstanceId]="0"
|
||||||
[contextInstanceId]="0" [maxHeight]="120">
|
[maxHeight]="120">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
|
|
@ -3,7 +3,9 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h2>{{ 'addon.notifications.notifications' | translate }}</h2>
|
<h2>{{ 'addon.notifications.notifications' | translate }}</h2>
|
||||||
|
</ion-title>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
</ion-header>
|
</ion-header>
|
||||||
<ion-content>
|
<ion-content>
|
||||||
|
@ -12,8 +14,7 @@
|
||||||
<core-user-avatar *ngIf="userIdFrom > 0" slot="start" [userId]="userIdFrom" [profileUrl]="profileImageUrlFrom"
|
<core-user-avatar *ngIf="userIdFrom > 0" slot="start" [userId]="userIdFrom" [profileUrl]="profileImageUrlFrom"
|
||||||
[fullname]="userFromFullName" [extraIcon]="iconUrl"></core-user-avatar>
|
[fullname]="userFromFullName" [extraIcon]="iconUrl"></core-user-avatar>
|
||||||
|
|
||||||
<img *ngIf="userIdFrom <= 0 && iconUrl" [src]="iconUrl" alt=""
|
<img *ngIf="userIdFrom <= 0 && iconUrl" [src]="iconUrl" alt="" role="presentation" class="core-notification-icon" slot="start">
|
||||||
role="presentation" class="core-notification-icon" slot="start">
|
|
||||||
|
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<p class="item-heading">{{ subject }}</p>
|
<p class="item-heading">{{ subject }}</p>
|
||||||
|
|
|
@ -3,7 +3,9 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>{{ 'addon.notifications.notifications' | translate }}</h1>
|
<h1>{{ 'addon.notifications.notifications' | translate }}</h1>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
|
@ -65,8 +67,7 @@
|
||||||
!(notification.processorsByName[currentProcessor!.name][state] &&
|
!(notification.processorsByName[currentProcessor!.name][state] &&
|
||||||
notification.processorsByName[currentProcessor!.name][state].updating)">
|
notification.processorsByName[currentProcessor!.name][state].updating)">
|
||||||
</ion-spinner>
|
</ion-spinner>
|
||||||
<ion-toggle
|
<ion-toggle *ngIf="preferences!.enableall && !notification.processorsByName[currentProcessor!.name].locked"
|
||||||
*ngIf="preferences!.enableall && !notification.processorsByName[currentProcessor!.name].locked"
|
|
||||||
[(ngModel)]="notification.processorsByName[currentProcessor!.name][state].checked"
|
[(ngModel)]="notification.processorsByName[currentProcessor!.name][state].checked"
|
||||||
(ngModelChange)="changePreference(notification, state)"
|
(ngModelChange)="changePreference(notification, state)"
|
||||||
[disabled]="notification.processorsByName[currentProcessor!.name][state].updating">
|
[disabled]="notification.processorsByName[currentProcessor!.name][state].updating">
|
||||||
|
@ -88,18 +89,15 @@
|
||||||
<!-- If notifications enabled, show toggles. If disabled, show "Disabled" instead of toggle. -->
|
<!-- If notifications enabled, show toggles. If disabled, show "Disabled" instead of toggle. -->
|
||||||
<ion-item *ngFor="let state of ['loggedin', 'loggedoff']" class="ion-text-wrap ion-hide-md-up" lines="none">
|
<ion-item *ngFor="let state of ['loggedin', 'loggedoff']" class="ion-text-wrap ion-hide-md-up" lines="none">
|
||||||
<ion-label>{{ 'core.settings.' + state | translate }}</ion-label>
|
<ion-label>{{ 'core.settings.' + state | translate }}</ion-label>
|
||||||
<ion-spinner slot="end"
|
<ion-spinner slot="end" *ngIf="preferences!.enableall && (notification.processorsByName[currentProcessor!.name][state] &&
|
||||||
*ngIf="preferences!.enableall && (notification.processorsByName[currentProcessor!.name][state] &&
|
|
||||||
notification.processorsByName[currentProcessor!.name][state].updating)">
|
notification.processorsByName[currentProcessor!.name][state].updating)">
|
||||||
</ion-spinner>
|
</ion-spinner>
|
||||||
<ion-toggle slot="end"
|
<ion-toggle slot="end" *ngIf="preferences!.enableall && !notification.processorsByName[currentProcessor!.name].locked"
|
||||||
*ngIf="preferences!.enableall && !notification.processorsByName[currentProcessor!.name].locked"
|
|
||||||
[(ngModel)]="notification.processorsByName[currentProcessor!.name][state].checked"
|
[(ngModel)]="notification.processorsByName[currentProcessor!.name][state].checked"
|
||||||
(ngModelChange)="changePreference(notification, state)"
|
(ngModelChange)="changePreference(notification, state)"
|
||||||
[disabled]="notification.processorsByName[currentProcessor!.name][state].updating">
|
[disabled]="notification.processorsByName[currentProcessor!.name][state].updating">
|
||||||
</ion-toggle>
|
</ion-toggle>
|
||||||
<span slot="end"
|
<span slot="end" *ngIf="preferences!.enableall && notification.processorsByName[currentProcessor!.name].locked"
|
||||||
*ngIf="preferences!.enableall && notification.processorsByName[currentProcessor!.name].locked"
|
|
||||||
class="text-gray">
|
class="text-gray">
|
||||||
{{'core.settings.locked' | translate }}
|
{{'core.settings.locked' | translate }}
|
||||||
</span>
|
</span>
|
||||||
|
|
|
@ -3,7 +3,9 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>{{ title }}</h1>
|
<h1>{{ title }}</h1>
|
||||||
|
</ion-title>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
</ion-header>
|
</ion-header>
|
||||||
<ion-content>
|
<ion-content>
|
||||||
|
@ -25,9 +27,11 @@
|
||||||
|
|
||||||
<!-- Display info about space used and space left. -->
|
<!-- Display info about space used and space left. -->
|
||||||
<ion-card class="core-info-card" *ngIf="userQuota && filesInfo && filesInfo.filecount > 0">
|
<ion-card class="core-info-card" *ngIf="userQuota && filesInfo && filesInfo.filecount > 0">
|
||||||
<ion-item><ion-label>
|
<ion-item>
|
||||||
|
<ion-label>
|
||||||
{{ 'core.quotausage' | translate:{$a: {used: spaceUsed, total: userQuotaReadable} } }}
|
{{ 'core.quotausage' | translate:{$a: {used: spaceUsed, total: userQuotaReadable} } }}
|
||||||
</ion-label></ion-item>
|
</ion-label>
|
||||||
|
</ion-item>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
|
||||||
<!-- List of files. -->
|
<!-- List of files. -->
|
||||||
|
|
|
@ -3,7 +3,9 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>{{ 'addon.storagemanager.managestorage' | translate }}</h1>
|
<h1>{{ 'addon.storagemanager.managestorage' | translate }}</h1>
|
||||||
|
</ion-title>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
</ion-header>
|
</ion-header>
|
||||||
<ion-content>
|
<ion-content>
|
||||||
|
@ -20,8 +22,7 @@
|
||||||
</ion-label>
|
</ion-label>
|
||||||
<p slot="end" class="ion-text-end">{{ totalSize | coreBytesToSize }}</p>
|
<p slot="end" class="ion-text-end">{{ totalSize | coreBytesToSize }}</p>
|
||||||
<ion-button slot="end" (click)="deleteForCourse()" [disabled]="totalSize == 0">
|
<ion-button slot="end" (click)="deleteForCourse()" [disabled]="totalSize == 0">
|
||||||
<ion-icon name="fas-trash" slot="icon-only"
|
<ion-icon name="fas-trash" slot="icon-only" [attr.aria-label]="'addon.storagemanager.deletecourse' | translate">
|
||||||
[attr.aria-label]="'addon.storagemanager.deletecourse' | translate">
|
|
||||||
</ion-icon>
|
</ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
@ -45,8 +46,8 @@
|
||||||
<ion-card-content>
|
<ion-card-content>
|
||||||
<ng-container *ngFor="let module of section.modules">
|
<ng-container *ngFor="let module of section.modules">
|
||||||
<ion-item class="ion-no-padding" *ngIf="module.totalSize! > 0">
|
<ion-item class="ion-no-padding" *ngIf="module.totalSize! > 0">
|
||||||
<core-mod-icon slot="start" *ngIf="module.handlerData!.icon"
|
<core-mod-icon slot="start" *ngIf="module.handlerData!.icon" [modicon]="module.handlerData!.icon"
|
||||||
[modicon]="module.handlerData!.icon" [modname]="module.modname" [componentId]="module.instance">
|
[modname]="module.modname" [componentId]="module.instance">
|
||||||
</core-mod-icon>
|
</core-mod-icon>
|
||||||
<ion-label class="ion-text-wrap">
|
<ion-label class="ion-text-wrap">
|
||||||
<h3 class="{{module.handlerData!.class}} addon-storagemanager-module-size">
|
<h3 class="{{module.handlerData!.class}} addon-storagemanager-module-size">
|
||||||
|
|
|
@ -3,7 +3,9 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>{{ 'addon.storagemanager.managestorage' | translate }}</h1>
|
<h1>{{ 'addon.storagemanager.managestorage' | translate }}</h1>
|
||||||
|
</ion-title>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
</ion-header>
|
</ion-header>
|
||||||
<ion-content>
|
<ion-content>
|
||||||
|
@ -14,12 +16,13 @@
|
||||||
<p class="ion-text-wrap">{{ 'addon.storagemanager.info' | translate }}</p>
|
<p class="ion-text-wrap">{{ 'addon.storagemanager.info' | translate }}</p>
|
||||||
<ion-item class="size ion-text-wrap ion-no-padding" lines="none">
|
<ion-item class="size ion-text-wrap ion-no-padding" lines="none">
|
||||||
<ion-icon name="fas-archive" slot="start" aria-hidden="true"></ion-icon>
|
<ion-icon name="fas-archive" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label><h2 class="ion-text-wrap">{{ 'addon.storagemanager.storageused' | translate }}</h2></ion-label>
|
<ion-label>
|
||||||
|
<h2 class="ion-text-wrap">{{ 'addon.storagemanager.storageused' | translate }}</h2>
|
||||||
|
</ion-label>
|
||||||
<p slot="end" class="ion-text-end">{{ totalSize | coreBytesToSize }}</p>
|
<p slot="end" class="ion-text-end">{{ totalSize | coreBytesToSize }}</p>
|
||||||
<ion-button slot="end" (click)="deleteCompletelyDownloadedCourses()"
|
<ion-button slot="end" (click)="deleteCompletelyDownloadedCourses()"
|
||||||
[disabled]="completelyDownloadedCourses.length === 0">
|
[disabled]="completelyDownloadedCourses.length === 0">
|
||||||
<ion-icon name="fas-trash" slot="icon-only"
|
<ion-icon name="fas-trash" slot="icon-only" ariaLabel="{{ 'addon.storagemanager.deletecourses' | translate }}">
|
||||||
ariaLabel="{{ 'addon.storagemanager.deletecourses' | translate }}">
|
|
||||||
</ion-icon>
|
</ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
<ion-header>
|
<ion-header>
|
||||||
<ion-toolbar>
|
<ion-toolbar>
|
||||||
<h1>{{ 'core.block.blocks' | translate }}</h1>
|
<ion-title>
|
||||||
|
<h2>{{ 'core.block.blocks' | translate }}</h2>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
<ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
||||||
<ion-icon name="fas-times" slot="icon-only" aria-hidden=true></ion-icon>
|
<ion-icon name="fas-times" slot="icon-only" aria-hidden=true></ion-icon>
|
||||||
|
|
|
@ -3,19 +3,20 @@
|
||||||
<ion-buttons slot="start">
|
<ion-buttons slot="start">
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
<ion-title>
|
||||||
<h1>
|
<h1>
|
||||||
<core-format-text [text]="title" [contextLevel]="contextLevel" [contextInstanceId]="instanceId" [courseId]="courseId">
|
<core-format-text [text]="title" [contextLevel]="contextLevel" [contextInstanceId]="instanceId" [courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
</h1>
|
</h1>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button *ngIf="canDeleteComments" slot="end" fill="clear" (click)="toggleDelete()"
|
<ion-button *ngIf="canDeleteComments" slot="end" fill="clear" (click)="toggleDelete()"
|
||||||
[attr.aria-label]="'core.toggledelete' | translate">
|
[attr.aria-label]="'core.toggledelete' | translate">
|
||||||
<ion-icon name="fas-pen" slot="icon-only" aria-hidden="true"></ion-icon>
|
<ion-icon name="fas-pen" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
<core-context-menu>
|
<core-context-menu>
|
||||||
<core-context-menu-item [hidden]="!(commentsLoaded && !hasOffline)" [priority]="100"
|
<core-context-menu-item [hidden]="!(commentsLoaded && !hasOffline)" [priority]="100" [content]="'core.refresh' | translate"
|
||||||
[content]="'core.refresh' | translate" (action)="refreshComments(false)" [iconAction]="refreshIcon"
|
(action)="refreshComments(false)" [iconAction]="refreshIcon" [closeOnClick]="true">
|
||||||
[closeOnClick]="true">
|
|
||||||
</core-context-menu-item>
|
</core-context-menu-item>
|
||||||
<core-context-menu-item [hidden]="!(commentsLoaded && hasOffline)" [priority]="100"
|
<core-context-menu-item [hidden]="!(commentsLoaded && hasOffline)" [priority]="100"
|
||||||
[content]="'core.settings.synchronizenow' | translate" (action)="refreshComments(true)" [iconAction]="syncIcon"
|
[content]="'core.settings.synchronizenow' | translate" (action)="refreshComments(true)" [iconAction]="syncIcon"
|
||||||
|
@ -30,8 +31,7 @@
|
||||||
<ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content>
|
<ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content>
|
||||||
</ion-refresher>
|
</ion-refresher>
|
||||||
<core-loading [hideUntil]="commentsLoaded">
|
<core-loading [hideUntil]="commentsLoaded">
|
||||||
<core-empty-box *ngIf="!comments || !comments.length" icon="fas-comments"
|
<core-empty-box *ngIf="!comments || !comments.length" icon="fas-comments" [message]="'core.comments.nocomments' | translate">
|
||||||
[message]="'core.comments.nocomments' | translate">
|
|
||||||
</core-empty-box>
|
</core-empty-box>
|
||||||
|
|
||||||
<!-- Load previous messages. -->
|
<!-- Load previous messages. -->
|
||||||
|
@ -45,10 +45,8 @@
|
||||||
{{ comment.timecreated * 1000 | coreFormatDate: "strftimedayshort" }}
|
{{ comment.timecreated * 1000 | coreFormatDate: "strftimedayshort" }}
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<ion-item class="ion-text-wrap addon-message"
|
<ion-item class="ion-text-wrap addon-message" [class.addon-message-mine]="comment.userid == currentUserId"
|
||||||
[class.addon-message-mine]="comment.userid == currentUserId"
|
[class.addon-message-not-mine]="comment.userid != currentUserId" [class.addon-message-no-user]="!comment.showUserData"
|
||||||
[class.addon-message-not-mine]="comment.userid != currentUserId"
|
|
||||||
[class.addon-message-no-user]="!comment.showUserData"
|
|
||||||
[@coreSlideInOut]="comment.userid == currentUserId ? '' : 'fromLeft'">
|
[@coreSlideInOut]="comment.userid == currentUserId ? '' : 'fromLeft'">
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<!-- User data. -->
|
<!-- User data. -->
|
||||||
|
@ -88,10 +86,7 @@
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
<ion-item
|
<ion-item *ngIf="offlineComment" class="ion-text-wrap addon-message addon-message-mine">
|
||||||
*ngIf="offlineComment"
|
|
||||||
class="ion-text-wrap addon-message addon-message-mine"
|
|
||||||
>
|
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<!-- User data. -->
|
<!-- User data. -->
|
||||||
<p class="ion-text-center">
|
<p class="ion-text-center">
|
||||||
|
@ -109,9 +104,9 @@
|
||||||
<ion-icon name="fas-clock" aria-hidden="true"></ion-icon> {{ 'core.notsent' | translate }}
|
<ion-icon name="fas-clock" aria-hidden="true"></ion-icon> {{ 'core.notsent' | translate }}
|
||||||
</ion-note>
|
</ion-note>
|
||||||
<div class="tail"></div>
|
<div class="tail"></div>
|
||||||
<ion-button *ngIf="showDelete" slot="end" fill="clear"
|
<ion-button *ngIf="showDelete" slot="end" fill="clear" [@coreSlideInOut]="'fromRight'" color="danger"
|
||||||
[@coreSlideInOut]="'fromRight'" color="danger" (click)="deleteComment($event, offlineComment)"
|
(click)="deleteComment($event, offlineComment)" [attr.aria-label]="'core.delete' | translate"
|
||||||
[attr.aria-label]="'core.delete' | translate" class="addon-messages-delete-button">
|
class="addon-messages-delete-button">
|
||||||
<ion-icon name="fas-trash" slot="icon-only" aria-hidden="true"></ion-icon>
|
<ion-icon name="fas-trash" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
@ -121,8 +116,8 @@
|
||||||
</ion-content>
|
</ion-content>
|
||||||
<ion-footer class="footer-adjustable" *ngIf="commentsLoaded && canAddComments">
|
<ion-footer class="footer-adjustable" *ngIf="commentsLoaded && canAddComments">
|
||||||
<ion-toolbar color="contrast">
|
<ion-toolbar color="contrast">
|
||||||
<core-send-message-form [sendDisabled]="sending" [message]="newComment"
|
<core-send-message-form [sendDisabled]="sending" [message]="newComment" (onSubmit)="addComment($event)"
|
||||||
(onSubmit)="addComment($event)" [placeholder]="'core.comments.addcomment' | translate">
|
[placeholder]="'core.comments.addcomment' | translate">
|
||||||
</core-send-message-form>
|
</core-send-message-form>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
</ion-footer>
|
</ion-footer>
|
||||||
|
|
|
@ -1,9 +1,8 @@
|
||||||
<ion-header>
|
<ion-header>
|
||||||
<ion-toolbar>
|
<ion-toolbar>
|
||||||
<ion-buttons slot="start">
|
<ion-title>
|
||||||
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
|
|
||||||
</ion-buttons>
|
|
||||||
<h2>{{ 'core.contentlinks.chooseaccount' | translate }}</h2>
|
<h2>{{ 'core.contentlinks.chooseaccount' | translate }}</h2>
|
||||||
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
<ion-button fill="clear" (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
||||||
<ion-icon slot="icon-only" name="fas-times" aria-hidden="true"></ion-icon>
|
<ion-icon slot="icon-only" name="fas-times" aria-hidden="true"></ion-icon>
|
||||||
|
@ -23,12 +22,13 @@
|
||||||
<ion-item *ngFor="let site of sites" (click)="siteClicked(site.id)" detail="false" button>
|
<ion-item *ngFor="let site of sites" (click)="siteClicked(site.id)" detail="false" button>
|
||||||
<ion-avatar slot="start">
|
<ion-avatar slot="start">
|
||||||
<img [src]="site.avatar" core-external-content [siteId]="site.id"
|
<img [src]="site.avatar" core-external-content [siteId]="site.id"
|
||||||
alt="{{ 'core.pictureof' | translate:{$a: site.fullName} }}"
|
alt="{{ 'core.pictureof' | translate:{$a: site.fullName} }}" onError="this.src='assets/img/user-avatar.png'">
|
||||||
onError="this.src='assets/img/user-avatar.png'">
|
|
||||||
</ion-avatar>
|
</ion-avatar>
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<p class="item-heading">{{site.fullName}}</p>
|
<p class="item-heading">{{site.fullName}}</p>
|
||||||
<p><core-format-text [text]="site.siteName" clean="true" [siteId]="site.id"></core-format-text></p>
|
<p>
|
||||||
|
<core-format-text [text]="site.siteName" clean="true" [siteId]="site.id"></core-format-text>
|
||||||
|
</p>
|
||||||
<p>{{site.siteUrl}}</p>
|
<p>{{site.siteUrl}}</p>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue