MOBILE-3744 icon: Add aria label information to ion icons
parent
23b30d0d33
commit
632e7dfc0c
|
@ -5,8 +5,9 @@
|
||||||
<!-- Download all courses. -->
|
<!-- Download all courses. -->
|
||||||
<div *ngIf="downloadCoursesEnabled && downloadEnabled && filteredCourses.length > 1 && !showFilter" class="core-button-spinner"
|
<div *ngIf="downloadCoursesEnabled && downloadEnabled && filteredCourses.length > 1 && !showFilter" class="core-button-spinner"
|
||||||
slot="end">
|
slot="end">
|
||||||
<ion-button *ngIf="!prefetchCoursesData[selectedFilter].loading" fill="clear" color="dark" (click)="prefetchCourses()">
|
<ion-button *ngIf="!prefetchCoursesData[selectedFilter].loading" fill="clear" color="dark" (click)="prefetchCourses()"
|
||||||
<ion-icon [name]="prefetchCoursesData[selectedFilter].icon" slot="icon-only">
|
[attr.aria-label]="'core.courses.downloadcourses' | translate">
|
||||||
|
<ion-icon [name]="prefetchCoursesData[selectedFilter].icon" slot="icon-only" aria-hidden="true">
|
||||||
</ion-icon>
|
</ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
<ion-badge class="core-course-download-courses-progress" *ngIf="prefetchCoursesData[selectedFilter].badge">
|
<ion-badge class="core-course-download-courses-progress" *ngIf="prefetchCoursesData[selectedFilter].badge">
|
||||||
|
|
|
@ -4,9 +4,8 @@
|
||||||
</ion-label>
|
</ion-label>
|
||||||
<div *ngIf="downloadCoursesEnabled && downloadEnabled && courses && courses.length > 1" class="core-button-spinner" slot="end">
|
<div *ngIf="downloadCoursesEnabled && downloadEnabled && courses && courses.length > 1" class="core-button-spinner" slot="end">
|
||||||
<ion-button *ngIf="prefetchCoursesData.icon && !prefetchCoursesData.loading" fill="clear" color="dark"
|
<ion-button *ngIf="prefetchCoursesData.icon && !prefetchCoursesData.loading" fill="clear" color="dark"
|
||||||
(click)="prefetchCourses()">
|
(click)="prefetchCourses()" [attr.aria-label]="'core.courses.downloadcourses' | translate">
|
||||||
<ion-icon [name]="prefetchCoursesData.icon" slot="icon-only">
|
<ion-icon [name]="prefetchCoursesData.icon" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
</ion-icon>
|
|
||||||
</ion-button>
|
</ion-button>
|
||||||
<ion-badge class="core-course-download-courses-progress" *ngIf="prefetchCoursesData.badge">
|
<ion-badge class="core-course-download-courses-progress" *ngIf="prefetchCoursesData.badge">
|
||||||
{{prefetchCoursesData.badge}}
|
{{prefetchCoursesData.badge}}
|
||||||
|
|
|
@ -4,9 +4,8 @@
|
||||||
</ion-label>
|
</ion-label>
|
||||||
<div *ngIf="downloadCoursesEnabled && downloadEnabled && courses && courses.length > 1" class="core-button-spinner" slot="end">
|
<div *ngIf="downloadCoursesEnabled && downloadEnabled && courses && courses.length > 1" class="core-button-spinner" slot="end">
|
||||||
<ion-button *ngIf="prefetchCoursesData.icon && !prefetchCoursesData.loading" fill="clear" color="dark"
|
<ion-button *ngIf="prefetchCoursesData.icon && !prefetchCoursesData.loading" fill="clear" color="dark"
|
||||||
(click)="prefetchCourses()">
|
(click)="prefetchCourses()" [attr.aria-label]="'core.courses.downloadcourses' | translate">
|
||||||
<ion-icon [name]="prefetchCoursesData.icon" slot="icon-only">
|
<ion-icon [name]="prefetchCoursesData.icon" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
</ion-icon>
|
|
||||||
</ion-button>
|
</ion-button>
|
||||||
<ion-badge class="core-course-download-courses-progress" *ngIf="prefetchCoursesData.badge">
|
<ion-badge class="core-course-download-courses-progress" *ngIf="prefetchCoursesData.badge">
|
||||||
{{prefetchCoursesData.badge}}
|
{{prefetchCoursesData.badge}}
|
||||||
|
|
|
@ -7,6 +7,8 @@
|
||||||
[title]="event.name">
|
[title]="event.name">
|
||||||
<img slot="start" [src]="event.iconUrl" alt="" role="presentation" *ngIf="event.iconUrl" class="core-module-icon">
|
<img slot="start" [src]="event.iconUrl" alt="" role="presentation" *ngIf="event.iconUrl" class="core-module-icon">
|
||||||
<ion-label>
|
<ion-label>
|
||||||
|
<!-- Add the icon title so accessibility tools read it. -->
|
||||||
|
<span class="sr-only" *ngIf="event.iconTitle">{{ event.iconTitle }}</span>
|
||||||
<h2>
|
<h2>
|
||||||
<core-format-text [text]="event.name" contextLevel="module" [contextInstanceId]="event.id"
|
<core-format-text [text]="event.name" contextLevel="module" [contextInstanceId]="event.id"
|
||||||
[courseId]="event.course && event.course.id">
|
[courseId]="event.course && event.course.id">
|
||||||
|
|
|
@ -103,6 +103,7 @@ export class AddonBlockTimelineEventsComponent implements OnChanges {
|
||||||
return start <= event.timesort;
|
return start <= event.timesort;
|
||||||
}).map((event) => {
|
}).map((event) => {
|
||||||
event.iconUrl = CoreCourse.getModuleIconSrc(event.icon.component);
|
event.iconUrl = CoreCourse.getModuleIconSrc(event.icon.component);
|
||||||
|
event.iconTitle = event.modulename && CoreCourse.translateModuleName(event.modulename);
|
||||||
|
|
||||||
return event;
|
return event;
|
||||||
});
|
});
|
||||||
|
@ -145,6 +146,7 @@ export class AddonBlockTimelineEventsComponent implements OnChanges {
|
||||||
|
|
||||||
type AddonBlockTimelineEvent = AddonCalendarEvent & {
|
type AddonBlockTimelineEvent = AddonCalendarEvent & {
|
||||||
iconUrl?: string;
|
iconUrl?: string;
|
||||||
|
iconTitle?: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
type AddonBlockTimelineEventFilteredEvent = {
|
type AddonBlockTimelineEventFilteredEvent = {
|
||||||
|
|
|
@ -71,7 +71,8 @@
|
||||||
<ion-row class="ion-text-center">
|
<ion-row class="ion-text-center">
|
||||||
<ion-col *ngIf="entry.lastmodified > entry.created">
|
<ion-col *ngIf="entry.lastmodified > entry.created">
|
||||||
<ion-note>
|
<ion-note>
|
||||||
<ion-icon name="fas-clock"></ion-icon> {{entry.lastmodified | coreTimeAgo}}
|
<ion-icon name="fas-clock"
|
||||||
|
[attr.aria-label]="'core.lastmodified' | translate"></ion-icon> {{entry.lastmodified | coreTimeAgo}}
|
||||||
</ion-note>
|
</ion-note>
|
||||||
</ion-col>
|
</ion-col>
|
||||||
</ion-row>
|
</ion-row>
|
||||||
|
|
|
@ -13,16 +13,16 @@
|
||||||
<ion-grid class="ion-no-padding addon-calendar-navigation">
|
<ion-grid class="ion-no-padding addon-calendar-navigation">
|
||||||
<ion-row class="ion-align-items-center">
|
<ion-row class="ion-align-items-center">
|
||||||
<ion-col class="ion-text-start" *ngIf="canNavigate">
|
<ion-col class="ion-text-start" *ngIf="canNavigate">
|
||||||
<ion-button fill="clear" (click)="loadPrevious()" [title]="'core.previous' | translate">
|
<ion-button fill="clear" (click)="loadPrevious()" [attr.aria-label]="'core.previous' | translate">
|
||||||
<ion-icon name="fas-chevron-left" slot="icon-only"></ion-icon>
|
<ion-icon name="fas-chevron-left" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-col>
|
</ion-col>
|
||||||
<ion-col class="ion-text-center addon-calendar-period">
|
<ion-col class="ion-text-center addon-calendar-period">
|
||||||
<h3>{{ periodName }}</h3>
|
<h3>{{ periodName }}</h3>
|
||||||
</ion-col>
|
</ion-col>
|
||||||
<ion-col class="ion-text-end" *ngIf="canNavigate">
|
<ion-col class="ion-text-end" *ngIf="canNavigate">
|
||||||
<ion-button fill="clear" (click)="loadNext()" [title]="'core.next' | translate">
|
<ion-button fill="clear" (click)="loadNext()" [attr.aria-label]="'core.next' | translate">
|
||||||
<ion-icon name="fas-chevron-right" slot="icon-only"></ion-icon>
|
<ion-icon name="fas-chevron-right" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-col>
|
</ion-col>
|
||||||
</ion-row>
|
</ion-row>
|
||||||
|
@ -55,16 +55,23 @@
|
||||||
<!-- In tablet, display list of events. -->
|
<!-- In tablet, display list of events. -->
|
||||||
<div class="ion-hide-md-down addon-calendar-day-events">
|
<div class="ion-hide-md-down addon-calendar-day-events">
|
||||||
<ng-container *ngFor="let event of day.filteredEvents | slice:0:4; let index = index">
|
<ng-container *ngFor="let event of day.filteredEvents | slice:0:4; let index = index">
|
||||||
<p *ngIf="index < 3 || day.filteredEvents.length == 4" class="addon-calendar-event"
|
<div role="button" *ngIf="index < 3 || day.filteredEvents.length == 4" class="addon-calendar-event"
|
||||||
(click)="eventClicked(event, $event)" [class.addon-calendar-event-past]="event.ispast">
|
(click)="eventClicked(event, $event)" [class.addon-calendar-event-past]="event.ispast">
|
||||||
<span class="calendar_event_type calendar_event_{{event.formattedType}}"></span>
|
<span class="calendar_event_type calendar_event_{{event.formattedType}}"></span>
|
||||||
<ion-icon *ngIf="event.offline && !event.deleted" name="far-clock"></ion-icon>
|
<ion-icon *ngIf="event.offline && !event.deleted" name="fas-clock"
|
||||||
<ion-icon *ngIf="event.deleted" name="fas-trash"></ion-icon>
|
[attr.aria-label]="'core.notsent' | translate"></ion-icon>
|
||||||
|
<ion-icon *ngIf="event.deleted" name="fas-trash" [attr.aria-label]="'core.deletedoffline' | translate">
|
||||||
|
</ion-icon>
|
||||||
<span class="addon-calendar-event-time">{{ event.timestart * 1000 | coreFormatDate: timeFormat }}</span>
|
<span class="addon-calendar-event-time">{{ event.timestart * 1000 | coreFormatDate: timeFormat }}</span>
|
||||||
<img *ngIf="event.moduleIcon" src="{{event.moduleIcon}}" alt="" role="presentation"
|
<img *ngIf="event.moduleIcon" src="{{event.moduleIcon}}" alt="" role="presentation"
|
||||||
class="core-module-icon">
|
class="core-module-icon">
|
||||||
|
<!-- Add the icon title so accessibility tools read it. -->
|
||||||
|
<span class="sr-only">
|
||||||
|
{{ 'addon.calendar.type' + event.formattedType | translate }}
|
||||||
|
<span class="sr-only" *ngIf="event.moduleIcon && event.iconTitle">{{ event.iconTitle }}</span>
|
||||||
|
</span>
|
||||||
<span class="addon-calendar-event-name">{{event.name}}</span>
|
<span class="addon-calendar-event-name">{{event.name}}</span>
|
||||||
</p>
|
</div>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
<p *ngIf="day.filteredEvents.length > 4" class="addon-calendar-day-more">
|
<p *ngIf="day.filteredEvents.length > 4" class="addon-calendar-day-more">
|
||||||
<b>{{ 'core.nummore' | translate:{$a: day.filteredEvents.length - 3} }}</b>
|
<b>{{ 'core.nummore' | translate:{$a: day.filteredEvents.length - 3} }}</b>
|
||||||
|
|
|
@ -70,6 +70,7 @@
|
||||||
margin-bottom: 0.6em;
|
margin-bottom: 0.6em;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
|
color: var(--text-color);
|
||||||
|
|
||||||
&.addon-calendar-event-past {
|
&.addon-calendar-event-past {
|
||||||
opacity: 0.5;
|
opacity: 0.5;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<ion-list>
|
<ion-list>
|
||||||
<ion-item *ngFor="let type of types" class="addon-calendar-event" [ngClass]="['addon-calendar-eventtype-'+type]">
|
<ion-item *ngFor="let type of types" class="addon-calendar-event" [ngClass]="['addon-calendar-eventtype-'+type]">
|
||||||
<ion-icon [name]="typeIcons[type]" slot="start"></ion-icon>
|
<ion-icon [name]="typeIcons[type]" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>{{ 'addon.calendar.' + type + 'events' | translate}}</ion-label>
|
<ion-label>{{ 'addon.calendar.' + type + 'events' | translate}}</ion-label>
|
||||||
<ion-toggle [(ngModel)]="filter[type]" (ionChange)="onChange()" slot="end"></ion-toggle>
|
<ion-toggle [(ngModel)]="filter[type]" (ionChange)="onChange()" slot="end"></ion-toggle>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
|
|
@ -6,20 +6,26 @@
|
||||||
<ng-container *ngFor="let event of filteredEvents">
|
<ng-container *ngFor="let event of filteredEvents">
|
||||||
<ion-item class="ion-text-wrap addon-calendar-event" [title]="event.name" (click)="eventClicked(event)"
|
<ion-item class="ion-text-wrap addon-calendar-event" [title]="event.name" (click)="eventClicked(event)"
|
||||||
[ngClass]="['addon-calendar-eventtype-'+event.eventtype]">
|
[ngClass]="['addon-calendar-eventtype-'+event.eventtype]">
|
||||||
<img *ngIf="event.moduleIcon" src="{{event.moduleIcon}}" slot="start" class="core-module-icon">
|
<img *ngIf="event.moduleIcon" src="{{event.moduleIcon}}" slot="start" class="core-module-icon" alt=""
|
||||||
<ion-icon *ngIf="event.eventIcon && !event.moduleIcon" [name]="event.eventIcon" slot="start">
|
role="presentation">
|
||||||
|
<ion-icon *ngIf="event.eventIcon && !event.moduleIcon" [name]="event.eventIcon" slot="start" aria-hidden="true">
|
||||||
</ion-icon>
|
</ion-icon>
|
||||||
<ion-label>
|
<ion-label>
|
||||||
|
<!-- Add the icon title so accessibility tools read it. -->
|
||||||
|
<span class="sr-only">
|
||||||
|
{{ 'addon.calendar.type' + event.formattedType | translate }}
|
||||||
|
<span class="sr-only" *ngIf="event.moduleIcon && event.iconTitle">{{ event.iconTitle }}</span>
|
||||||
|
</span>
|
||||||
<h2><core-format-text [text]="event.name" [contextLevel]="event.contextLevel"
|
<h2><core-format-text [text]="event.name" [contextLevel]="event.contextLevel"
|
||||||
[contextInstanceId]="event.contextInstanceId"></core-format-text></h2>
|
[contextInstanceId]="event.contextInstanceId"></core-format-text></h2>
|
||||||
<p [innerHTML]="event.formattedtime"></p>
|
<p [innerHTML]="event.formattedtime"></p>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
<ion-note *ngIf="event.offline && !event.deleted" slot="end">
|
<ion-note *ngIf="event.offline && !event.deleted" slot="end">
|
||||||
<ion-icon name="far-clock"></ion-icon>
|
<ion-icon name="fas-clock" aria-hidden="true"></ion-icon>
|
||||||
<span class="ion-text-wrap">{{ 'core.notsent' | translate }}</span>
|
<span class="ion-text-wrap">{{ 'core.notsent' | translate }}</span>
|
||||||
</ion-note>
|
</ion-note>
|
||||||
<ion-note *ngIf="event.deleted" slot="end">
|
<ion-note *ngIf="event.deleted" slot="end">
|
||||||
<ion-icon name="fas-trash"></ion-icon>
|
<ion-icon name="fas-trash" aria-hidden="true"></ion-icon>
|
||||||
<span class="ion-text-wrap">{{ 'core.deletedoffline' | translate }}</span>
|
<span class="ion-text-wrap">{{ 'core.deletedoffline' | translate }}</span>
|
||||||
</ion-note>
|
</ion-note>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
<ion-title>{{ 'addon.calendar.calendarevents' | translate }}</ion-title>
|
<ion-title>{{ 'addon.calendar.calendarevents' | translate }}</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button (click)="openFilter($event)" [attr.aria-label]="'core.filter' | translate">
|
<ion-button (click)="openFilter($event)" [attr.aria-label]="'core.filter' | translate">
|
||||||
<ion-icon slot="icon-only" name="fas-filter"></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="!isCurrentDay" [priority]="900" [content]="'addon.calendar.today' | translate"
|
<core-context-menu-item *ngIf="!isCurrentDay" [priority]="900" [content]="'addon.calendar.today' | translate"
|
||||||
|
@ -29,26 +29,26 @@
|
||||||
<ion-grid class="ion-no-padding safe-area-page">
|
<ion-grid class="ion-no-padding safe-area-page">
|
||||||
<ion-row class="ion-align-items-center">
|
<ion-row class="ion-align-items-center">
|
||||||
<ion-col class="ion-text-start" *ngIf="currentMoment">
|
<ion-col class="ion-text-start" *ngIf="currentMoment">
|
||||||
<ion-button fill="clear" (click)="loadPrevious()" [title]="'addon.calendar.dayprev' | translate">
|
<ion-button fill="clear" (click)="loadPrevious()" [attr.aria-label]="'addon.calendar.dayprev' | translate">
|
||||||
<ion-icon name="fas-chevron-left" slot="icon-only"></ion-icon>
|
<ion-icon name="fas-chevron-left" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-col>
|
</ion-col>
|
||||||
<ion-col class="ion-text-center addon-calendar-period">
|
<ion-col class="ion-text-center addon-calendar-period">
|
||||||
<h3>{{ periodName }}</h3>
|
<h3>{{ periodName }}</h3>
|
||||||
</ion-col>
|
</ion-col>
|
||||||
<ion-col class="ion-text-end" *ngIf="currentMoment">
|
<ion-col class="ion-text-end" *ngIf="currentMoment">
|
||||||
<ion-button fill="clear" (click)="loadNext()" [title]="'addon.calendar.daynext' | translate">
|
<ion-button fill="clear" (click)="loadNext()" [attr.aria-label]="'addon.calendar.daynext' | translate">
|
||||||
<ion-icon name="fas-chevron-right" slot="icon-only"></ion-icon>
|
<ion-icon name="fas-chevron-right" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-col>
|
</ion-col>
|
||||||
</ion-row>
|
</ion-row>
|
||||||
</ion-grid>
|
</ion-grid>
|
||||||
|
|
||||||
<core-loading [hideUntil]="loaded" class="safe-area-page">
|
<core-loading [hideUntil]="loaded" class="safe-area-page">
|
||||||
<!-- There is data to be synchronized --> <!-- There is data to be synchronized -->
|
<!-- There is data to be synchronized -->
|
||||||
<ion-card class="core-warning-card" *ngIf="hasOffline">
|
<ion-card class="core-warning-card" *ngIf="hasOffline">
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-icon name="fas-exclamation-triangle" slot="start"></ion-icon>
|
<ion-icon name="fas-exclamation-triangle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>{{ 'core.hasdatatosync' | translate:{$a: 'core.day' | translate} }}</ion-label>
|
<ion-label>{{ 'core.hasdatatosync' | translate:{$a: 'core.day' | translate} }}</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
@ -61,20 +61,26 @@
|
||||||
<ng-container *ngFor="let event of filteredEvents">
|
<ng-container *ngFor="let event of filteredEvents">
|
||||||
<ion-item class="addon-calendar-event ion-text-wrap" [title]="event.name" (click)="gotoEvent(event.id)"
|
<ion-item class="addon-calendar-event ion-text-wrap" [title]="event.name" (click)="gotoEvent(event.id)"
|
||||||
[class.item-dimmed]="event.ispast" [ngClass]="['addon-calendar-eventtype-'+event.eventtype]">
|
[class.item-dimmed]="event.ispast" [ngClass]="['addon-calendar-eventtype-'+event.eventtype]">
|
||||||
<img *ngIf="event.moduleIcon" src="{{event.moduleIcon}}" slot="start" class="core-module-icon">
|
<img *ngIf="event.moduleIcon" src="{{event.moduleIcon}}" slot="start" class="core-module-icon" alt=""
|
||||||
<ion-icon *ngIf="event.eventIcon && !event.moduleIcon" [name]="event.eventIcon" slot="start">
|
role="presentation">
|
||||||
|
<ion-icon *ngIf="event.eventIcon && !event.moduleIcon" [name]="event.eventIcon" slot="start" aria-hidden="true">
|
||||||
</ion-icon>
|
</ion-icon>
|
||||||
<ion-label>
|
<ion-label>
|
||||||
|
<!-- Add the icon title so accessibility tools read it. -->
|
||||||
|
<span class="sr-only">
|
||||||
|
{{ 'addon.calendar.type' + event.formattedType | translate }}
|
||||||
|
<span class="sr-only" *ngIf="event.moduleIcon && event.iconTitle">{{ event.iconTitle }}</span>
|
||||||
|
</span>
|
||||||
<h2><core-format-text [text]="event.name" [contextLevel]="event.contextLevel"
|
<h2><core-format-text [text]="event.name" [contextLevel]="event.contextLevel"
|
||||||
[contextInstanceId]="event.contextInstanceId"></core-format-text></h2>
|
[contextInstanceId]="event.contextInstanceId"></core-format-text></h2>
|
||||||
<p [innerHTML]="event.formattedtime"></p>
|
<p [innerHTML]="event.formattedtime"></p>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
<ion-note *ngIf="event.offline && !event.deleted" slot="end">
|
<ion-note *ngIf="event.offline && !event.deleted" slot="end">
|
||||||
<ion-icon name="far-clock"></ion-icon>
|
<ion-icon name="fas-clock" aria-hidden="true"></ion-icon>
|
||||||
<span class="ion-text-wrap">{{ 'core.notsent' | translate }}</span>
|
<span class="ion-text-wrap">{{ 'core.notsent' | translate }}</span>
|
||||||
</ion-note>
|
</ion-note>
|
||||||
<ion-note *ngIf="event.deleted" slot="end">
|
<ion-note *ngIf="event.deleted" slot="end">
|
||||||
<ion-icon name="fas-trash"></ion-icon>
|
<ion-icon name="fas-trash" aria-hidden="true"></ion-icon>
|
||||||
<span class="ion-text-wrap">{{ 'core.deletedoffline' | translate }}</span>
|
<span class="ion-text-wrap">{{ 'core.deletedoffline' | translate }}</span>
|
||||||
</ion-note>
|
</ion-note>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
@ -85,7 +91,7 @@
|
||||||
<!-- Create a calendar event. -->
|
<!-- Create a calendar event. -->
|
||||||
<ion-fab slot="fixed" core-fab vertical="bottom" horizontal="end" *ngIf="canCreate && loaded">
|
<ion-fab slot="fixed" core-fab vertical="bottom" horizontal="end" *ngIf="canCreate && loaded">
|
||||||
<ion-fab-button (click)="openEdit()" [attr.aria-label]="'addon.calendar.newevent' | translate">
|
<ion-fab-button (click)="openEdit()" [attr.aria-label]="'addon.calendar.newevent' | translate">
|
||||||
<ion-icon name="fas-plus"></ion-icon>
|
<ion-icon name="fas-plus" aria-hidden="true"></ion-icon>
|
||||||
</ion-fab-button>
|
</ion-fab-button>
|
||||||
</ion-fab>
|
</ion-fab>
|
||||||
</ion-content>
|
</ion-content>
|
||||||
|
|
|
@ -120,9 +120,10 @@
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
<!-- Advanced options. -->
|
<!-- Advanced options. -->
|
||||||
<ion-item-divider class="ion-text-wrap core-expandable" (click)="toggleAdvanced()">
|
<ion-item-divider class="ion-text-wrap core-expandable" (click)="toggleAdvanced()"
|
||||||
<ion-icon *ngIf="!advanced" name="fas-caret-right" slot="start"></ion-icon>
|
[attr.aria-label]="(advanced ? 'core.showless' : 'core.showmore') | translate">
|
||||||
<ion-icon *ngIf="advanced" name="fas-caret-down" slot="start"></ion-icon>
|
<ion-icon *ngIf="!advanced" name="fas-caret-right" slot="start" aria-hidden="true"></ion-icon>
|
||||||
|
<ion-icon *ngIf="advanced" name="fas-caret-down" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<span *ngIf="!advanced">{{ 'core.showmore' | translate }}</span>
|
<span *ngIf="!advanced">{{ 'core.showmore' | translate }}</span>
|
||||||
<span *ngIf="advanced">{{ 'core.showless' | translate }}</span>
|
<span *ngIf="advanced">{{ 'core.showless' | translate }}</span>
|
||||||
|
|
|
@ -5,7 +5,12 @@
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
<ion-title *ngIf="event">
|
<ion-title *ngIf="event">
|
||||||
<img *ngIf="event.moduleIcon" src="{{event.moduleIcon}}" alt="" role="presentation" class="core-module-icon">
|
<img *ngIf="event.moduleIcon" src="{{event.moduleIcon}}" alt="" role="presentation" class="core-module-icon">
|
||||||
<ion-icon *ngIf="event.eventIcon && !event.moduleIcon" [name]="event.eventIcon"></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. -->
|
||||||
|
<span class="sr-only">
|
||||||
|
{{ 'addon.calendar.type' + event.formattedType | translate }}
|
||||||
|
<span class="sr-only" *ngIf="event.moduleIcon && event.iconTitle">{{ event.iconTitle }}</span>
|
||||||
|
</span>
|
||||||
<core-format-text [text]="event.name" [contextLevel]="event.contextLevel"
|
<core-format-text [text]="event.name" [contextLevel]="event.contextLevel"
|
||||||
[contextInstanceId]="event.contextInstanceId"></core-format-text>
|
[contextInstanceId]="event.contextInstanceId"></core-format-text>
|
||||||
</ion-title>
|
</ion-title>
|
||||||
|
@ -38,7 +43,7 @@
|
||||||
<!-- There is data to be synchronized -->
|
<!-- There is data to be synchronized -->
|
||||||
<ion-card class="core-warning-card" *ngIf="hasOffline || (event && event.deleted)">
|
<ion-card class="core-warning-card" *ngIf="hasOffline || (event && event.deleted)">
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-icon name="fas-exclamation-triangle" slot="start"></ion-icon>
|
<ion-icon name="fas-exclamation-triangle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>{{ 'core.hasdatatosync' | translate:{$a: 'addon.calendar.calendarevent' | translate} }}</ion-label>
|
<ion-label>{{ 'core.hasdatatosync' | translate:{$a: 'addon.calendar.calendarevent' | translate} }}</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
@ -48,9 +53,13 @@
|
||||||
<ion-item class="ion-text-wrap" *ngIf="isSplitViewOn">
|
<ion-item class="ion-text-wrap" *ngIf="isSplitViewOn">
|
||||||
<img *ngIf="event.moduleIcon" src="{{event.moduleIcon}}" slot="start" alt="" role="presentation"
|
<img *ngIf="event.moduleIcon" src="{{event.moduleIcon}}" slot="start" alt="" role="presentation"
|
||||||
class="core-module-icon">
|
class="core-module-icon">
|
||||||
<ion-icon *ngIf="event.eventIcon && !event.moduleIcon" [name]="event.eventIcon" slot="start">
|
<ion-icon *ngIf="event.eventIcon && !event.moduleIcon" [name]="event.eventIcon" slot="start" aria-hidden="true">
|
||||||
</ion-icon>
|
</ion-icon>
|
||||||
<ion-label>
|
<ion-label>
|
||||||
|
<span class="sr-only">
|
||||||
|
{{ 'addon.calendar.type' + event.formattedType | translate }}
|
||||||
|
<span class="sr-only" *ngIf="event.moduleIcon && event.iconTitle">{{ event.iconTitle }}</span>
|
||||||
|
</span>
|
||||||
<h2>{{ 'addon.calendar.eventname' | translate }}</h2>
|
<h2>{{ 'addon.calendar.eventname' | translate }}</h2>
|
||||||
<p>
|
<p>
|
||||||
<core-format-text [text]="event.name" [contextLevel]="event.contextLevel"
|
<core-format-text [text]="event.name" [contextLevel]="event.contextLevel"
|
||||||
|
@ -58,7 +67,7 @@
|
||||||
</p>
|
</p>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
<ion-note slot="end" *ngIf="event.deleted">
|
<ion-note slot="end" *ngIf="event.deleted">
|
||||||
<ion-icon name="fas-trash"></ion-icon> {{ 'core.deletedoffline' | translate }}
|
<ion-icon name="fas-trash" aria-hidden="true"></ion-icon> {{ 'core.deletedoffline' | translate }}
|
||||||
</ion-note>
|
</ion-note>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ion-item>
|
<ion-item>
|
||||||
|
@ -67,7 +76,7 @@
|
||||||
<p [innerHTML]="event.formattedtime"></p>
|
<p [innerHTML]="event.formattedtime"></p>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
<ion-note slot="end" *ngIf="!isSplitViewOn && event.deleted">
|
<ion-note slot="end" *ngIf="!isSplitViewOn && event.deleted">
|
||||||
<ion-icon name="fas-trash"></ion-icon> {{ 'core.deletedoffline' | translate }}
|
<ion-icon name="fas-trash" aria-hidden="true"></ion-icon> {{ 'core.deletedoffline' | translate }}
|
||||||
</ion-note>
|
</ion-note>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ion-item>
|
<ion-item>
|
||||||
|
@ -144,9 +153,9 @@
|
||||||
<p *ngIf="reminder.time > 0">{{ reminder.time * 1000 | coreFormatDate }}</p>
|
<p *ngIf="reminder.time > 0">{{ reminder.time * 1000 | coreFormatDate }}</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" slot="end"
|
[attr.aria-label]="'core.delete' | translate" slot="end"
|
||||||
*ngIf="(reminder.time == -1 ? (event.timestart - defaultTime) : reminder.time) > currentTime!">
|
*ngIf="(reminder.time == -1 ? (event.timestart - defaultTime) : reminder.time) > currentTime!">
|
||||||
<ion-icon name="fas-trash" color="danger" slot="icon-only"></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>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
<ion-title>{{ (showCalendar ? 'addon.calendar.calendarevents' : 'addon.calendar.upcomingevents') | translate }}</ion-title>
|
<ion-title>{{ (showCalendar ? 'addon.calendar.calendarevents' : 'addon.calendar.upcomingevents') | translate }}</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button (click)="openFilter($event)" [attr.aria-label]="'core.filter' | translate">
|
<ion-button (click)="openFilter($event)" [attr.aria-label]="'core.filter' | translate">
|
||||||
<ion-icon slot="icon-only" name="fas-filter"></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"
|
||||||
|
@ -33,7 +33,7 @@
|
||||||
<!-- There is data to be synchronized -->
|
<!-- There is data to be synchronized -->
|
||||||
<ion-card class="core-warning-card" *ngIf="hasOffline">
|
<ion-card class="core-warning-card" *ngIf="hasOffline">
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-icon name="fas-exclamation-triangle" slot="start"></ion-icon>
|
<ion-icon name="fas-exclamation-triangle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>{{ 'core.hasdatatosync' | translate:{$a: 'addon.calendar.calendar' | translate} }}</ion-label>
|
<ion-label>{{ 'core.hasdatatosync' | translate:{$a: 'addon.calendar.calendar' | translate} }}</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
@ -49,7 +49,7 @@
|
||||||
<!-- Create a calendar event. -->
|
<!-- Create a calendar event. -->
|
||||||
<ion-fab slot="fixed" core-fab vertical="bottom" horizontal="end" *ngIf="canCreate">
|
<ion-fab slot="fixed" core-fab vertical="bottom" horizontal="end" *ngIf="canCreate">
|
||||||
<ion-fab-button (click)="openEdit()" [attr.aria-label]="'addon.calendar.newevent' | translate">
|
<ion-fab-button (click)="openEdit()" [attr.aria-label]="'addon.calendar.newevent' | translate">
|
||||||
<ion-icon name="fas-plus"></ion-icon>
|
<ion-icon name="fas-plus" aria-hidden="true"></ion-icon>
|
||||||
</ion-fab-button>
|
</ion-fab-button>
|
||||||
</ion-fab>
|
</ion-fab>
|
||||||
</ion-content>
|
</ion-content>
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
<ion-title>{{ 'addon.calendar.calendarevents' | translate }}</ion-title>
|
<ion-title>{{ 'addon.calendar.calendarevents' | translate }}</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button (click)="openFilter($event)" [attr.aria-label]="'core.filter' | translate">
|
<ion-button (click)="openFilter($event)" [attr.aria-label]="'core.filter' | translate">
|
||||||
<ion-icon slot="icon-only" name="fas-filter"></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 [hidden]="!notificationsEnabled" [priority]="600"
|
<core-context-menu-item [hidden]="!notificationsEnabled" [priority]="600"
|
||||||
|
@ -28,7 +28,7 @@
|
||||||
<!-- There is data to be synchronized -->
|
<!-- There is data to be synchronized -->
|
||||||
<ion-card class="core-warning-card" *ngIf="hasOffline">
|
<ion-card class="core-warning-card" *ngIf="hasOffline">
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-icon name="fas-exclamation-triangle" slot="start"></ion-icon>
|
<ion-icon name="fas-exclamation-triangle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>{{ 'core.hasdatatosync' | translate:{$a: 'addon.calendar.calendar' | translate} }}</ion-label>
|
<ion-label>{{ 'core.hasdatatosync' | translate:{$a: 'addon.calendar.calendar' | translate} }}</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
@ -44,11 +44,18 @@
|
||||||
</ion-item-divider>
|
</ion-item-divider>
|
||||||
<ion-item class="addon-calendar-event ion-text-wrap" [title]="event.name" (click)="gotoEvent(event.id)"
|
<ion-item class="addon-calendar-event ion-text-wrap" [title]="event.name" (click)="gotoEvent(event.id)"
|
||||||
[class.core-selected-item]="event.id == eventId" [ngClass]="['addon-calendar-eventtype-'+event.eventtype]">
|
[class.core-selected-item]="event.id == eventId" [ngClass]="['addon-calendar-eventtype-'+event.eventtype]">
|
||||||
<img *ngIf="event.moduleIcon" src="{{event.moduleIcon}}" slot="start" class="core-module-icon">
|
<img *ngIf="event.moduleIcon" src="{{event.moduleIcon}}" slot="start" class="core-module-icon" alt=""
|
||||||
<ion-icon *ngIf="event.eventIcon && !event.moduleIcon" [name]="event.eventIcon" slot="start">
|
role="presentation">
|
||||||
|
<ion-icon *ngIf="event.eventIcon && !event.moduleIcon" [name]="event.eventIcon" slot="start"
|
||||||
|
aria-hidden="true">
|
||||||
</ion-icon>
|
</ion-icon>
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<h2>
|
<h2>
|
||||||
|
<!-- Add the icon title so accessibility tools read it. -->
|
||||||
|
<span class="sr-only">
|
||||||
|
{{ 'addon.calendar.type' + event.formattedType | translate }}
|
||||||
|
<span class="sr-only" *ngIf="event.moduleIcon && event.iconTitle">{{ event.iconTitle }}</span>
|
||||||
|
</span>
|
||||||
<core-format-text [text]="event.name" [contextLevel]="event.contextLevel"
|
<core-format-text [text]="event.name" [contextLevel]="event.contextLevel"
|
||||||
[contextInstanceId]="event.contextInstanceId">
|
[contextInstanceId]="event.contextInstanceId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
|
@ -64,11 +71,11 @@
|
||||||
</p>
|
</p>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
<ion-note *ngIf="event.offline && !event.deleted" slot="end">
|
<ion-note *ngIf="event.offline && !event.deleted" slot="end">
|
||||||
<ion-icon name="far-clock"></ion-icon>
|
<ion-icon name="fas-clock" aria-hidden="true"></ion-icon>
|
||||||
<span class="ion-text-wrap">{{ 'core.notsent' | translate }}</span>
|
<span class="ion-text-wrap">{{ 'core.notsent' | translate }}</span>
|
||||||
</ion-note>
|
</ion-note>
|
||||||
<ion-note *ngIf="event.deleted" slot="end">
|
<ion-note *ngIf="event.deleted" slot="end">
|
||||||
<ion-icon name="fas-trash"></ion-icon>
|
<ion-icon name="fas-trash" aria-hidden="true"></ion-icon>
|
||||||
<span class="ion-text-wrap">{{ 'core.deletedoffline' | translate }}</span>
|
<span class="ion-text-wrap">{{ 'core.deletedoffline' | translate }}</span>
|
||||||
</ion-note>
|
</ion-note>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
@ -82,7 +89,7 @@
|
||||||
<!-- Create a calendar event. -->
|
<!-- Create a calendar event. -->
|
||||||
<ion-fab slot="fixed" core-fab vertical="bottom" horizontal="end" *ngIf="canCreate">
|
<ion-fab slot="fixed" core-fab vertical="bottom" horizontal="end" *ngIf="canCreate">
|
||||||
<ion-fab-button (click)="openEdit()" [attr.aria-label]="'addon.calendar.newevent' | translate">
|
<ion-fab-button (click)="openEdit()" [attr.aria-label]="'addon.calendar.newevent' | translate">
|
||||||
<ion-icon name="fas-plus"></ion-icon>
|
<ion-icon name="fas-plus" aria-hidden="true"></ion-icon>
|
||||||
</ion-fab-button>
|
</ion-fab-button>
|
||||||
</ion-fab>
|
</ion-fab>
|
||||||
</core-split-view>
|
</core-split-view>
|
||||||
|
|
|
@ -189,6 +189,7 @@ export class AddonCalendarHelperProvider {
|
||||||
if (event.modulename) {
|
if (event.modulename) {
|
||||||
eventFormatted.eventIcon = CoreCourse.getModuleIconSrc(event.modulename);
|
eventFormatted.eventIcon = CoreCourse.getModuleIconSrc(event.modulename);
|
||||||
eventFormatted.moduleIcon = eventFormatted.eventIcon;
|
eventFormatted.moduleIcon = eventFormatted.eventIcon;
|
||||||
|
eventFormatted.iconTitle = CoreCourse.translateModuleName(event.modulename);
|
||||||
}
|
}
|
||||||
|
|
||||||
eventFormatted.formattedType = AddonCalendar.getEventType(event);
|
eventFormatted.formattedType = AddonCalendar.getEventType(event);
|
||||||
|
|
|
@ -2250,6 +2250,7 @@ export type AddonCalendarEventToDisplay = Partial<AddonCalendarCalendarEvent> &
|
||||||
deleted?: boolean; // Calculated in the app. Whether it has been deleted in offline.
|
deleted?: boolean; // Calculated in the app. Whether it has been deleted in offline.
|
||||||
encodedLocation?: SafeUrl; // Calculated in the app. Sanitized location link.
|
encodedLocation?: SafeUrl; // Calculated in the app. Sanitized location link.
|
||||||
eventIcon?: string; // Calculated in the app. Event icon.
|
eventIcon?: string; // Calculated in the app. Event icon.
|
||||||
|
iconTitle?: string;
|
||||||
moduleIcon?: string; // Calculated in the app. Module icon.
|
moduleIcon?: string; // Calculated in the app. Module icon.
|
||||||
formattedType: string; // Calculated in the app. Formatted type.
|
formattedType: string; // Calculated in the app. Formatted type.
|
||||||
duration?: number; // Calculated in the app. Duration of offline event.
|
duration?: number; // Calculated in the app. Duration of offline event.
|
||||||
|
|
|
@ -75,7 +75,7 @@
|
||||||
</p>
|
</p>
|
||||||
<ion-item class="ion-text-wrap" *ngFor="let activity of coursemodules" [href]="activity.url" [title]="activity.name"
|
<ion-item class="ion-text-wrap" *ngFor="let activity of coursemodules" [href]="activity.url" [title]="activity.name"
|
||||||
core-link capture="true">
|
core-link capture="true">
|
||||||
<img slot="start" core-external-content [src]="activity.iconurl" alt="" role="presentation" *ngIf="activity.iconurl"
|
<img slot="start" core-external-content [src]="activity.iconurl" alt="" *ngIf="activity.iconurl"
|
||||||
class="core-module-icon">
|
class="core-module-icon">
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<core-format-text [text]="activity.name" contextLevel="module" [contextInstanceId]="activity.id"
|
<core-format-text [text]="activity.name" contextLevel="module" [contextInstanceId]="activity.id"
|
||||||
|
|
|
@ -105,7 +105,7 @@
|
||||||
</p>
|
</p>
|
||||||
<ion-item class="ion-text-wrap core-course-module-handler item-media" [title]="activity.name" core-link
|
<ion-item class="ion-text-wrap core-course-module-handler item-media" [title]="activity.name" core-link
|
||||||
*ngFor="let activity of competency.coursemodules" [href]="activity.url" capture="true">
|
*ngFor="let activity of competency.coursemodules" [href]="activity.url" capture="true">
|
||||||
<img slot="start" [src]="activity.iconurl" core-external-content alt="" role="presentation"
|
<img slot="start" [src]="activity.iconurl" core-external-content alt=""
|
||||||
*ngIf="activity.iconurl" class="core-module-icon">
|
*ngIf="activity.iconurl" class="core-module-icon">
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<core-format-text [text]="activity.name" contextLevel="module" [contextInstanceId]="activity.id"
|
<core-format-text [text]="activity.name" contextLevel="module" [contextInstanceId]="activity.id"
|
||||||
|
|
|
@ -84,7 +84,7 @@
|
||||||
|
|
||||||
<ion-card class="core-warning-card" *ngIf="!tracked">
|
<ion-card class="core-warning-card" *ngIf="!tracked">
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-icon name="fas-exclamation-triangle" slot="start"></ion-icon>
|
<ion-icon name="fas-exclamation-triangle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>{{ 'addon.coursecompletion.nottracked' | translate }}</ion-label>
|
<ion-label>{{ 'addon.coursecompletion.nottracked' | translate }}</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
<ion-title>{{ 'addon.messages.groupinfo' | translate }}</ion-title>
|
<ion-title>{{ 'addon.messages.groupinfo' | translate }}</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
<ion-button (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
||||||
<ion-icon name="fas-times" slot="icon-only"></ion-icon>
|
<ion-icon name="fas-times" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
|
@ -39,7 +39,8 @@
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<h2>
|
<h2>
|
||||||
{{ member.fullname }}
|
{{ member.fullname }}
|
||||||
<ion-icon name="fas-user-slash" *ngIf="member.isblocked" [title]="'addon.messages.contactblocked' | translate">
|
<ion-icon name="fas-user-slash" *ngIf="member.isblocked"
|
||||||
|
[attr.aria-label]="'addon.messages.contactblocked' | translate">
|
||||||
</ion-icon>
|
</ion-icon>
|
||||||
</h2>
|
</h2>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
|
|
|
@ -5,8 +5,8 @@
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
<ion-title>{{ 'addon.messages.contacts' | translate }}</ion-title>
|
<ion-title>{{ 'addon.messages.contacts' | translate }}</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button (click)="gotoSearch()" [attr.aria-label]="'addon.messages.search' | translate">
|
<ion-button (click)="gotoSearch()" [attr.aria-label]="'addon.messages.searchcombined' | translate">
|
||||||
<ion-icon name="fas-search" slot="icon-only"></ion-icon>
|
<ion-icon name="fas-search" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
<!-- Add an empty context menu so discussion page can add items in split view, otherwise the menu
|
<!-- Add an empty context menu so discussion page can add items in split view, otherwise the menu
|
||||||
disappears in some cases. -->
|
disappears in some cases. -->
|
||||||
|
@ -36,7 +36,8 @@
|
||||||
<h2>
|
<h2>
|
||||||
<core-format-text [text]="contact.fullname" contextLevel="system" [contextInstanceId]="0">
|
<core-format-text [text]="contact.fullname" contextLevel="system" [contextInstanceId]="0">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
<ion-icon *ngIf="contact.isblocked" name="fas-user-slash" slot="end">
|
<ion-icon *ngIf="contact.isblocked" name="fas-user-slash" slot="end"
|
||||||
|
[attr.aria-label]="'addon.messages.contactblocked' | translate">
|
||||||
</ion-icon>
|
</ion-icon>
|
||||||
</h2>
|
</h2>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
|
|
|
@ -13,17 +13,18 @@
|
||||||
</core-user-avatar>
|
</core-user-avatar>
|
||||||
<core-format-text [text]="title" contextLevel="system" [contextInstanceId]="0"
|
<core-format-text [text]="title" contextLevel="system" [contextInstanceId]="0"
|
||||||
(click)="showInfo && !isGroup && viewInfo()"></core-format-text>
|
(click)="showInfo && !isGroup && viewInfo()"></core-format-text>
|
||||||
<ion-icon *ngIf="conversation && conversation.isfavourite" name="fas-star" [title]="'core.favourites' | translate">
|
<ion-icon *ngIf="conversation && conversation.isfavourite" name="fas-star"
|
||||||
|
[attr.aria-label]="'core.favourites' | translate">
|
||||||
</ion-icon>
|
</ion-icon>
|
||||||
<ion-icon *ngIf="conversation && conversation.ismuted" name="fas-bell-slash"
|
<ion-icon *ngIf="conversation && conversation.ismuted" name="fas-bell-slash"
|
||||||
[title]="'addon.messages.mutedconversation' | translate">
|
[attr.aria-label]="'addon.messages.mutedconversation' | translate">
|
||||||
</ion-icon>
|
</ion-icon>
|
||||||
</div>
|
</div>
|
||||||
</ion-title>
|
</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 [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>
|
||||||
|
@ -82,7 +83,7 @@
|
||||||
<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="arrow-round-down"></ion-icon>
|
<ion-icon name="fas-arrow-down" aria-hidden="true"></ion-icon>
|
||||||
</ion-chip>
|
</ion-chip>
|
||||||
|
|
||||||
<ion-item class="ion-text-wrap addon-message" (longPress)="copyMessage(message)"
|
<ion-item class="ion-text-wrap addon-message" (longPress)="copyMessage(message)"
|
||||||
|
@ -99,7 +100,9 @@
|
||||||
<div *ngIf="message.showUserData">{{ members[message.useridfrom].fullname }}</div>
|
<div *ngIf="message.showUserData">{{ members[message.useridfrom].fullname }}</div>
|
||||||
|
|
||||||
<ion-note *ngIf="!message.pending">{{ message.timecreated | coreFormatDate: "strftimetime" }}</ion-note>
|
<ion-note *ngIf="!message.pending">{{ message.timecreated | coreFormatDate: "strftimetime" }}</ion-note>
|
||||||
<ion-note *ngIf="message.pending"><ion-icon name="far-clock"></ion-icon></ion-note>
|
<ion-note *ngIf="message.pending">
|
||||||
|
<ion-icon name="fas-clock" [attr.aria-label]="'core.notsent' | translate "></ion-icon>
|
||||||
|
</ion-note>
|
||||||
</h2>
|
</h2>
|
||||||
|
|
||||||
<!-- Some messages have <p> and some others don't. Add a <p> so they all have same styles. -->
|
<!-- Some messages have <p> and some others don't. Add a <p> so they all have same styles. -->
|
||||||
|
@ -111,7 +114,7 @@
|
||||||
<ion-button fill="clear" *ngIf="!message.sending && showDelete" (click)="deleteMessage(message, index)"
|
<ion-button fill="clear" *ngIf="!message.sending && showDelete" (click)="deleteMessage(message, index)"
|
||||||
class="addon-messages-delete-button" [@coreSlideInOut]="'fromRight'"
|
class="addon-messages-delete-button" [@coreSlideInOut]="'fromRight'"
|
||||||
[attr.aria-label]=" 'addon.messages.deletemessage' | translate" slot="end">
|
[attr.aria-label]=" 'addon.messages.deletemessage' | translate" slot="end">
|
||||||
<ion-icon name="fas-trash" color="danger" slot="icon-only"></ion-icon>
|
<ion-icon name="fas-trash" color="danger" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
|
|
||||||
<div class="tail" *ngIf="message.showTail"></div>
|
<div class="tail" *ngIf="message.showTail"></div>
|
||||||
|
@ -126,7 +129,7 @@
|
||||||
<ion-fab slot="fixed" core-fab vertical="bottom" horizontal="end" *ngIf="loaded && newMessages > 0">
|
<ion-fab slot="fixed" core-fab vertical="bottom" horizontal="end" *ngIf="loaded && newMessages > 0">
|
||||||
<ion-fab-button size="small" (click)="scrollToFirstUnreadMessage()" color="light"
|
<ion-fab-button size="small" (click)="scrollToFirstUnreadMessage()" color="light"
|
||||||
[attr.aria-label]="'addon.messages.newmessages' | translate">
|
[attr.aria-label]="'addon.messages.newmessages' | translate">
|
||||||
<ion-icon name="fas-arrow-down"></ion-icon>
|
<ion-icon name="fas-arrow-down" aria-hidden="true"></ion-icon>
|
||||||
<span class="core-discussion-messages-badge">{{ newMessages }}</span>
|
<span class="core-discussion-messages-badge">{{ newMessages }}</span>
|
||||||
</ion-fab-button>
|
</ion-fab-button>
|
||||||
</ion-fab>
|
</ion-fab>
|
||||||
|
|
|
@ -27,7 +27,7 @@
|
||||||
|
|
||||||
<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>
|
[attr.aria-label]="'addon.messages.contacts' | translate" detail>
|
||||||
<ion-icon name="fas-address-book" slot="start"></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>
|
||||||
|
|
||||||
|
|
|
@ -5,11 +5,11 @@
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
<ion-title>{{ 'addon.messages.messages' | translate }}</ion-title>
|
<ion-title>{{ 'addon.messages.messages' | translate }}</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button (click)="gotoSearch()" [attr.aria-label]="'addon.messages.search' | translate">
|
<ion-button (click)="gotoSearch()" [attr.aria-label]="'addon.messages.searchcombined' | translate">
|
||||||
<ion-icon name="fas-search" slot="icon-only"></ion-icon>
|
<ion-icon name="fas-search" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
<ion-button (click)="gotoSettings()" [attr.aria-label]="'addon.messages.messagepreferences' | translate">
|
<ion-button (click)="gotoSettings()" [attr.aria-label]="'addon.messages.messagepreferences' | translate">
|
||||||
<ion-icon name="fas-cog" slot="icon-only"></ion-icon>
|
<ion-icon name="fas-cog" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
<!-- Add an empty context menu so discussion page can add items in split view,
|
<!-- Add an empty context menu so discussion page can add items in split view,
|
||||||
otherwise the menu disappears in some cases. -->
|
otherwise the menu disappears in some cases. -->
|
||||||
|
@ -27,14 +27,16 @@
|
||||||
<ion-list>
|
<ion-list>
|
||||||
<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>
|
[attr.aria-label]="'addon.messages.contacts' | translate" detail>
|
||||||
<ion-icon name="fas-address-book" slot="start"></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">{{contactRequestsCount}}</ion-badge>
|
<ion-badge *ngIf="contactRequestsCount > 0" slot="end">{{contactRequestsCount}}</ion-badge>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<!-- Favourite conversations. -->
|
<!-- Favourite conversations. -->
|
||||||
<ion-item-divider class="ion-text-wrap core-expandable" (click)="toggle(favourites)" sticky="true">
|
<ion-item-divider class="ion-text-wrap core-expandable" (click)="toggle(favourites)" sticky="true"
|
||||||
<ion-icon *ngIf="!favourites.expanded" name="fas-caret-right" slot="start"></ion-icon>
|
[attr.aria-label]="(favourites.expanded ? 'core.collapse' : 'core.expand') | translate"
|
||||||
<ion-icon *ngIf="favourites.expanded" name="fas-caret-down" slot="start"></ion-icon>
|
[attr.aria-expanded]="favourites.expanded">
|
||||||
|
<ion-icon *ngIf="!favourites.expanded" name="fas-caret-right" 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>{{ 'core.favourites' | translate }} ({{ favourites.count }})</ion-label>
|
<ion-label>{{ 'core.favourites' | translate }} ({{ favourites.count }})</ion-label>
|
||||||
<ion-badge slot="end" *ngIf="favourites.unread">{{ favourites.unread }}</ion-badge>
|
<ion-badge slot="end" *ngIf="favourites.unread">{{ favourites.unread }}</ion-badge>
|
||||||
</ion-item-divider>
|
</ion-item-divider>
|
||||||
|
@ -53,9 +55,11 @@
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
|
||||||
<!-- Group conversations. -->
|
<!-- Group conversations. -->
|
||||||
<ion-item-divider class="ion-text-wrap core-expandable" (click)="toggle(group)" sticky="true">
|
<ion-item-divider class="ion-text-wrap core-expandable" (click)="toggle(group)" sticky="true"
|
||||||
<ion-icon *ngIf="!group.expanded" name="fas-caret-right" slot="start"></ion-icon>
|
[attr.aria-label]="(group.expanded ? 'core.collapse' : 'core.expand') | translate"
|
||||||
<ion-icon *ngIf="group.expanded" name="fas-caret-down" slot="start"></ion-icon>
|
[attr.aria-expanded]="group.expanded">
|
||||||
|
<ion-icon *ngIf="!group.expanded" name="fas-caret-right" 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>{{ 'addon.messages.groupconversations' | translate }} ({{ group.count }})</ion-label>
|
<ion-label>{{ 'addon.messages.groupconversations' | translate }} ({{ group.count }})</ion-label>
|
||||||
<ion-badge slot="end" *ngIf="group.unread">{{ group.unread }}</ion-badge>
|
<ion-badge slot="end" *ngIf="group.unread">{{ group.unread }}</ion-badge>
|
||||||
</ion-item-divider>
|
</ion-item-divider>
|
||||||
|
@ -73,9 +77,11 @@
|
||||||
<ion-label><ion-spinner></ion-spinner></ion-label>
|
<ion-label><ion-spinner></ion-spinner></ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
|
||||||
<ion-item-divider class="ion-text-wrap core-expandable" (click)="toggle(individual)" sticky="true">
|
<ion-item-divider class="ion-text-wrap core-expandable" (click)="toggle(individual)" sticky="true"
|
||||||
<ion-icon *ngIf="!individual.expanded" name="fas-caret-right" slot="start"></ion-icon>
|
[attr.aria-label]="(individual.expanded ? 'core.collapse' : 'core.expand') | translate"
|
||||||
<ion-icon *ngIf="individual.expanded" name="fas-caret-down" slot="start"></ion-icon>
|
[attr.aria-expanded]="individual.expanded">
|
||||||
|
<ion-icon *ngIf="!individual.expanded" name="fas-caret-right" slot="start" aria-hidden="true"></ion-icon>
|
||||||
|
<ion-icon *ngIf="individual.expanded" name="fas-caret-down" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>{{ 'addon.messages.individualconversations' | translate }} ({{ individual.count }})</ion-label>
|
<ion-label>{{ 'addon.messages.individualconversations' | translate }} ({{ individual.count }})</ion-label>
|
||||||
<ion-badge slot="end" *ngIf="individual.unread">{{ individual.unread }}</ion-badge>
|
<ion-badge slot="end" *ngIf="individual.unread">{{ individual.unread }}</ion-badge>
|
||||||
</ion-item-divider>
|
</ion-item-divider>
|
||||||
|
|
|
@ -47,8 +47,10 @@
|
||||||
<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>
|
||||||
<h2>
|
<h2>
|
||||||
<core-format-text [text]="result.fullname" [highlight]="result.highlightName" [filter]="false"></core-format-text>
|
<core-format-text [text]="result.fullname" [highlight]="result.highlightName" [filter]="false">
|
||||||
<ion-icon name="fa-ban" *ngIf="result.isblocked" [title]="'addon.messages.contactblocked' | translate">
|
</core-format-text>
|
||||||
|
<ion-icon name="fa-ban" *ngIf="result.isblocked"
|
||||||
|
[attr.aria-label]="'addon.messages.contactblocked' | translate">
|
||||||
</ion-icon>
|
</ion-icon>
|
||||||
</h2>
|
</h2>
|
||||||
<ion-note *ngIf="result.lastmessagedate > 0">
|
<ion-note *ngIf="result.lastmessagedate > 0">
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
<ion-title>{{ plugin.name }}</ion-title>
|
<ion-title>{{ plugin.name }}</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
<ion-button (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
||||||
<ion-icon slot="icon-only" name="fas-times"></ion-icon>
|
<ion-icon slot="icon-only" name="fas-times" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
|
|
|
@ -49,7 +49,7 @@
|
||||||
<!-- Assign has something offline. -->
|
<!-- Assign has something offline. -->
|
||||||
<ion-card class="core-warning-card" *ngIf="hasOffline">
|
<ion-card class="core-warning-card" *ngIf="hasOffline">
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-icon name="fas-exclamation-triangle" slot="start"></ion-icon>
|
<ion-icon name="fas-exclamation-triangle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>{{ 'core.hasdatatosync' | translate: {$a: moduleName} }}</ion-label>
|
<ion-label>{{ 'core.hasdatatosync' | translate: {$a: moduleName} }}</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
@ -128,7 +128,7 @@
|
||||||
<!-- Ungrouped users. -->
|
<!-- Ungrouped users. -->
|
||||||
<ion-card *ngIf="assign.teamsubmission && summary && summary.warnofungroupedusers" class="core-info-card">
|
<ion-card *ngIf="assign.teamsubmission && summary && summary.warnofungroupedusers" class="core-info-card">
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-icon name="fas-question-circle" slot="start"></ion-icon>
|
<ion-icon name="fas-question-circle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>{{ 'addon.mod_assign.'+summary.warnofungroupedusers | translate }}</ion-label>
|
<ion-label>{{ 'addon.mod_assign.'+summary.warnofungroupedusers | translate }}</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
|
|
@ -225,8 +225,9 @@
|
||||||
<h2>{{ 'addon.mod_assign.currentgrade' | translate }}</h2>
|
<h2>{{ 'addon.mod_assign.currentgrade' | translate }}</h2>
|
||||||
<p><core-format-text [text]="feedback!.gradefordisplay" [filter]="false"></core-format-text></p>
|
<p><core-format-text [text]="feedback!.gradefordisplay" [filter]="false"></core-format-text></p>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
<ion-button slot="end" *ngIf="feedback!.advancedgrade" (click)="showAdvancedGrade()">
|
<ion-button slot="end" *ngIf="feedback!.advancedgrade" (click)="showAdvancedGrade()"
|
||||||
<ion-icon name="fas-search" slot="icon-only"></ion-icon>
|
[attr.aria-label]="'core.showadvanced' |translate">
|
||||||
|
<ion-icon name="fas-search" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
|
||||||
|
@ -348,12 +349,12 @@
|
||||||
<!-- Warning message if cannot save grades. -->
|
<!-- Warning message if cannot save grades. -->
|
||||||
<ion-card *ngIf="isGrading && !canSaveGrades" class="core-warning-card">
|
<ion-card *ngIf="isGrading && !canSaveGrades" class="core-warning-card">
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-icon name="fas-exclamation-triangle" slot="start"></ion-icon>
|
<ion-icon name="fas-exclamation-triangle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<p>{{ 'addon.mod_assign.cannotgradefromapp' | translate }}</p>
|
<p>{{ 'addon.mod_assign.cannotgradefromapp' | translate }}</p>
|
||||||
<ion-button expand="block" *ngIf="gradeUrl" [href]="gradeUrl" core-link >
|
<ion-button expand="block" *ngIf="gradeUrl" [href]="gradeUrl" core-link >
|
||||||
{{ 'core.openinbrowser' | translate }}
|
{{ 'core.openinbrowser' | translate }}
|
||||||
<ion-icon name="fas-external-link-alt" slot="end"></ion-icon>
|
<ion-icon name="fas-external-link-alt" slot="end" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
|
|
@ -11,13 +11,13 @@
|
||||||
</ion-label>
|
</ion-label>
|
||||||
<div slot="end">
|
<div slot="end">
|
||||||
<div class="ion-text-end">
|
<div class="ion-text-end">
|
||||||
<ion-button fill="clear" *ngIf="canEdit" (click)="editComment()" color="dark">
|
<ion-button fill="clear" *ngIf="canEdit" (click)="editComment()" color="dark"
|
||||||
<ion-icon name="fas-pen" slot="icon-only"></ion-icon>
|
[attr.aria-label]="'core.edit' | translate">
|
||||||
|
<ion-icon name="fas-pen" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</div>
|
</div>
|
||||||
<ion-note *ngIf="!isSent" color="dark">
|
<ion-note *ngIf="!isSent" color="dark">
|
||||||
<ion-icon name="far-clock"></ion-icon>
|
<ion-icon name="fas-clock" aria-hidden="true"></ion-icon> {{ 'core.notsent' | translate }}
|
||||||
{{ 'core.notsent' | translate }}
|
|
||||||
</ion-note>
|
</ion-note>
|
||||||
</div>
|
</div>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
|
|
@ -75,7 +75,7 @@
|
||||||
|
|
||||||
<ion-card class="ion-text-wrap core-warning-card" *ngIf="!haveAllParticipants">
|
<ion-card class="ion-text-wrap core-warning-card" *ngIf="!haveAllParticipants">
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-icon name="fas-exclamation-triangle" slot="start"></ion-icon>
|
<ion-icon name="fas-exclamation-triangle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>{{ 'addon.mod_assign.notallparticipantsareshown' | translate }}</ion-label>
|
<ion-label>{{ 'addon.mod_assign.notallparticipantsareshown' | translate }}</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<!-- Buttons to add to the header. -->
|
<!-- Buttons to add to the header. -->
|
||||||
<core-navbar-buttons slot="end">
|
<core-navbar-buttons slot="end">
|
||||||
<ion-button (click)="showToc()" [attr.aria-label]="'addon.mod_book.toc' | translate" aria-haspopup="true" *ngIf="loaded">
|
<ion-button (click)="showToc()" [attr.aria-label]="'addon.mod_book.toc' | translate" aria-haspopup="true" *ngIf="loaded">
|
||||||
<ion-icon name="fas-bookmark" slot="icon-only"></ion-icon>
|
<ion-icon name="fas-bookmark" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
<core-context-menu>
|
<core-context-menu>
|
||||||
<core-context-menu-item *ngIf="externalUrl" [priority]="900" [content]="'core.openinbrowser' | translate"
|
<core-context-menu-item *ngIf="externalUrl" [priority]="900" [content]="'core.openinbrowser' | translate"
|
||||||
|
@ -27,8 +27,10 @@
|
||||||
contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId"></core-course-module-description>
|
contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId"></core-course-module-description>
|
||||||
|
|
||||||
<ion-card class="core-warning-card" *ngIf="warning">
|
<ion-card class="core-warning-card" *ngIf="warning">
|
||||||
<ion-icon name="fas-exclamation-triangle" slot="start"></ion-icon>
|
<ion-item>
|
||||||
<span [innerHTML]="warning"></span>
|
<ion-icon name="fas-exclamation-triangle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
|
<ion-label><span [innerHTML]="warning"></span></ion-label>
|
||||||
|
</ion-item>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
|
||||||
<div class="ion-padding safe-padding-horizontal">
|
<div class="ion-padding safe-padding-horizontal">
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
<ion-title>{{ 'addon.mod_book.toc' | translate }}</ion-title>
|
<ion-title>{{ 'addon.mod_book.toc' | translate }}</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
<ion-button (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
||||||
<ion-icon name="fas-times" slot="icon-only"></ion-icon>
|
<ion-icon name="fas-times" slot="icon-only" aria-hidden=true></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
|
|
||||||
<ion-card *ngIf="chatInfo" class="core-info-card">
|
<ion-card *ngIf="chatInfo" class="core-info-card">
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-icon name="fas-clock" slot="start"></ion-icon>
|
<ion-icon name="fas-clock" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>{{ 'addon.mod_chat.sessionstart' | translate:{$a: chatInfo} }}</ion-label>
|
<ion-label>{{ 'addon.mod_chat.sessionstart' | translate:{$a: chatInfo} }}</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
<ion-title>{{ 'addon.mod_chat.currentusers' | translate }}</ion-title>
|
<ion-title>{{ 'addon.mod_chat.currentusers' | translate }}</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
<ion-button (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
||||||
<ion-icon slot="icon-only" name="fas-times"></ion-icon>
|
<ion-icon slot="icon-only" name="fas-times" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
|
@ -21,11 +21,11 @@
|
||||||
<h2>{{ user.fullname }}</h2>
|
<h2>{{ user.fullname }}</h2>
|
||||||
<ng-container *ngIf="currentUserId != user.id && isOnline">
|
<ng-container *ngIf="currentUserId != user.id && isOnline">
|
||||||
<ion-button fill="clear" (click)="talkTo(user)">
|
<ion-button fill="clear" (click)="talkTo(user)">
|
||||||
<ion-icon name="fas-comments" slot="start"></ion-icon>
|
<ion-icon name="fas-comments" slot="start" aria-hidden="true"></ion-icon>
|
||||||
{{ 'addon.mod_chat.talk' | translate }}
|
{{ 'addon.mod_chat.talk' | translate }}
|
||||||
</ion-button>
|
</ion-button>
|
||||||
<ion-button fill="clear" (click)="beepTo(user)">
|
<ion-button fill="clear" (click)="beepTo(user)">
|
||||||
<ion-icon name="fas-bell" slot="start"></ion-icon>
|
<ion-icon name="fas-bell" slot="start" aria-hidden="true"></ion-icon>
|
||||||
{{ 'addon.mod_chat.beep' | translate }}
|
{{ 'addon.mod_chat.beep' | translate }}
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
</ion-title>
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button *ngIf="loaded" (click)="showChatUsers()" [attr.aria-label]="'core.users' | translate">
|
<ion-button *ngIf="loaded" (click)="showChatUsers()" [attr.aria-label]="'core.users' | translate">
|
||||||
<ion-icon name="fas-users" slot="icon-only"></ion-icon>
|
<ion-icon name="fas-users" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
|
@ -26,7 +26,7 @@
|
||||||
<div class="ion-text-center addon-mod_chat-notice" *ngIf="message.special">
|
<div class="ion-text-center addon-mod_chat-notice" *ngIf="message.special">
|
||||||
<ion-badge class="ion-text-wrap" color="success" *ngIf="message.system && message.message == 'enter'">
|
<ion-badge class="ion-text-wrap" color="success" *ngIf="message.system && message.message == 'enter'">
|
||||||
<span>
|
<span>
|
||||||
<ion-icon name="fas-sign-in-alt"></ion-icon>
|
<ion-icon name="fas-sign-in-alt" aria-hidden="true"></ion-icon>
|
||||||
{{ message.timestamp * 1000 | coreFormatDate:"strftimetime" }}
|
{{ message.timestamp * 1000 | coreFormatDate:"strftimetime" }}
|
||||||
{{ 'addon.mod_chat.messageenter' | translate:{$a: message.userfullname} }}
|
{{ 'addon.mod_chat.messageenter' | translate:{$a: message.userfullname} }}
|
||||||
</span>
|
</span>
|
||||||
|
@ -34,7 +34,7 @@
|
||||||
|
|
||||||
<ion-badge class="ion-text-wrap" color="danger" *ngIf="message.system && message.message == 'exit'">
|
<ion-badge class="ion-text-wrap" color="danger" *ngIf="message.system && message.message == 'exit'">
|
||||||
<span>
|
<span>
|
||||||
<ion-icon name="fas-sign-out-alt"></ion-icon>
|
<ion-icon name="fas-sign-out-alt" aria-hidden="true"></ion-icon>
|
||||||
{{ message.timestamp * 1000 | coreFormatDate:"strftimetime" }}
|
{{ message.timestamp * 1000 | coreFormatDate:"strftimetime" }}
|
||||||
{{ 'addon.mod_chat.messageexit' | translate:{$a: message.userfullname} }}
|
{{ 'addon.mod_chat.messageexit' | translate:{$a: message.userfullname} }}
|
||||||
</span>
|
</span>
|
||||||
|
@ -42,7 +42,7 @@
|
||||||
|
|
||||||
<ion-badge class="ion-text-wrap" color="primary" *ngIf="message.beep == 'all'">
|
<ion-badge class="ion-text-wrap" color="primary" *ngIf="message.beep == 'all'">
|
||||||
<span>
|
<span>
|
||||||
<ion-icon name="fas-bell"></ion-icon>
|
<ion-icon name="fas-bell" aria-hidden="true"></ion-icon>
|
||||||
{{ message.timestamp * 1000 | coreFormatDate:"strftimetime" }}
|
{{ message.timestamp * 1000 | coreFormatDate:"strftimetime" }}
|
||||||
{{ 'addon.mod_chat.messagebeepseveryone' | translate:{$a: message.userfullname} }}
|
{{ 'addon.mod_chat.messagebeepseveryone' | translate:{$a: message.userfullname} }}
|
||||||
</span>
|
</span>
|
||||||
|
@ -51,7 +51,7 @@
|
||||||
<ion-badge class="ion-text-wrap" color="primary"
|
<ion-badge class="ion-text-wrap" color="primary"
|
||||||
*ngIf="message.userid != currentUserId && message.beep == currentUserId">
|
*ngIf="message.userid != currentUserId && message.beep == currentUserId">
|
||||||
<span>
|
<span>
|
||||||
<ion-icon name="fas-bell"></ion-icon>
|
<ion-icon name="fas-bell" aria-hidden="true"></ion-icon>
|
||||||
{{ message.timestamp * 1000 | coreFormatDate:"strftimetime" }}
|
{{ message.timestamp * 1000 | coreFormatDate:"strftimetime" }}
|
||||||
{{ 'addon.mod_chat.messagebeepsyou' | translate:{$a: message.userfullname} }}
|
{{ 'addon.mod_chat.messagebeepsyou' | translate:{$a: message.userfullname} }}
|
||||||
</span>
|
</span>
|
||||||
|
@ -60,7 +60,7 @@
|
||||||
<ion-badge class="ion-text-wrap" color="light"
|
<ion-badge class="ion-text-wrap" color="light"
|
||||||
*ngIf="message.userid == currentUserId && message.beep && message.beep != 'all'">
|
*ngIf="message.userid == currentUserId && message.beep && message.beep != 'all'">
|
||||||
<span>
|
<span>
|
||||||
<ion-icon name="fas-bell"></ion-icon>
|
<ion-icon name="fas-bell" aria-hidden="true"></ion-icon>
|
||||||
{{ message.timestamp * 1000 | coreFormatDate:"strftimetime" }}
|
{{ message.timestamp * 1000 | coreFormatDate:"strftimetime" }}
|
||||||
{{ 'addon.mod_chat.messageyoubeep' | translate:{$a: message.beepWho} }}
|
{{ 'addon.mod_chat.messageyoubeep' | translate:{$a: message.beepWho} }}
|
||||||
</span>
|
</span>
|
||||||
|
@ -68,7 +68,7 @@
|
||||||
|
|
||||||
<ion-badge class="ion-text-wrap" color="info" *ngIf="!message.system && !message.beep">
|
<ion-badge class="ion-text-wrap" color="info" *ngIf="!message.system && !message.beep">
|
||||||
<span>
|
<span>
|
||||||
<ion-icon name="fas-asterisk"></ion-icon>
|
<ion-icon name="fas-asterisk" aria-hidden="true"></ion-icon>
|
||||||
{{ message.timestamp * 1000 | coreFormatDate:"strftimetime" }}
|
{{ message.timestamp * 1000 | coreFormatDate:"strftimetime" }}
|
||||||
<strong>
|
<strong>
|
||||||
{{ message.userfullname }} <core-format-text [text]="message.message" contextLevel="module"
|
{{ message.userfullname }} <core-format-text [text]="message.message" contextLevel="module"
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
<div class="ion-text-center addon-mod_chat-notice" *ngIf="message.special">
|
<div class="ion-text-center addon-mod_chat-notice" *ngIf="message.special">
|
||||||
<ion-badge class="ion-text-wrap" color="success" *ngIf="message.issystem && message.message == 'enter'">
|
<ion-badge class="ion-text-wrap" color="success" *ngIf="message.issystem && message.message == 'enter'">
|
||||||
<span>
|
<span>
|
||||||
<ion-icon name="fas-sign-in-alt"></ion-icon>
|
<ion-icon name="fas-sign-in-alt" aria-hidden="true"></ion-icon>
|
||||||
{{ message.timestamp * 1000 | coreFormatDate:"strftimetime" }}
|
{{ message.timestamp * 1000 | coreFormatDate:"strftimetime" }}
|
||||||
{{ 'addon.mod_chat.messageenter' | translate:{$a: message.userfullname} }}
|
{{ 'addon.mod_chat.messageenter' | translate:{$a: message.userfullname} }}
|
||||||
</span>
|
</span>
|
||||||
|
@ -29,7 +29,7 @@
|
||||||
|
|
||||||
<ion-badge class="ion-text-wrap" color="danger" *ngIf="message.issystem && message.message == 'exit'">
|
<ion-badge class="ion-text-wrap" color="danger" *ngIf="message.issystem && message.message == 'exit'">
|
||||||
<span>
|
<span>
|
||||||
<ion-icon name="fas-sign-out-alt"></ion-icon>
|
<ion-icon name="fas-sign-out-alt" aria-hidden="true"></ion-icon>
|
||||||
{{ message.timestamp * 1000 | coreFormatDate:"strftimetime" }}
|
{{ message.timestamp * 1000 | coreFormatDate:"strftimetime" }}
|
||||||
{{ 'addon.mod_chat.messageexit' | translate:{$a: message.userfullname} }}
|
{{ 'addon.mod_chat.messageexit' | translate:{$a: message.userfullname} }}
|
||||||
</span>
|
</span>
|
||||||
|
@ -37,7 +37,7 @@
|
||||||
|
|
||||||
<ion-badge class="ion-text-wrap" color="primary" *ngIf="message.beep == 'all'">
|
<ion-badge class="ion-text-wrap" color="primary" *ngIf="message.beep == 'all'">
|
||||||
<span>
|
<span>
|
||||||
<ion-icon name="fas-bell"></ion-icon>
|
<ion-icon name="fas-bell" aria-hidden="true"></ion-icon>
|
||||||
{{ message.timestamp * 1000 | coreFormatDate:"strftimetime" }}
|
{{ message.timestamp * 1000 | coreFormatDate:"strftimetime" }}
|
||||||
{{ 'addon.mod_chat.messagebeepseveryone' | translate:{$a: message.userfullname} }}
|
{{ 'addon.mod_chat.messagebeepseveryone' | translate:{$a: message.userfullname} }}
|
||||||
</span>
|
</span>
|
||||||
|
@ -46,7 +46,7 @@
|
||||||
<ion-badge class="ion-text-wrap" color="primary"
|
<ion-badge class="ion-text-wrap" color="primary"
|
||||||
*ngIf="message.userid != currentUserId && message.beep == currentUserId">
|
*ngIf="message.userid != currentUserId && message.beep == currentUserId">
|
||||||
<span>
|
<span>
|
||||||
<ion-icon name="fas-bell"></ion-icon>
|
<ion-icon name="fas-bell" aria-hidden="true"></ion-icon>
|
||||||
{{ message.timestamp * 1000 | coreFormatDate:"strftimetime" }}
|
{{ message.timestamp * 1000 | coreFormatDate:"strftimetime" }}
|
||||||
{{ 'addon.mod_chat.messagebeepsyou' | translate:{$a: message.userfullname} }}
|
{{ 'addon.mod_chat.messagebeepsyou' | translate:{$a: message.userfullname} }}
|
||||||
</span>
|
</span>
|
||||||
|
@ -55,7 +55,7 @@
|
||||||
<ion-badge class="ion-text-wrap" color="light"
|
<ion-badge class="ion-text-wrap" color="light"
|
||||||
*ngIf="message.userid == currentUserId && message.beep && message.beep != 'all'">
|
*ngIf="message.userid == currentUserId && message.beep && message.beep != 'all'">
|
||||||
<span>
|
<span>
|
||||||
<ion-icon name="fas-bell"></ion-icon>
|
<ion-icon name="fas-bell" aria-hidden="true"></ion-icon>
|
||||||
{{ message.timestamp * 1000 | coreFormatDate:"strftimetime" }}
|
{{ message.timestamp * 1000 | coreFormatDate:"strftimetime" }}
|
||||||
{{ 'addon.mod_chat.messageyoubeep' | translate:{$a: message.beepWho} }}
|
{{ 'addon.mod_chat.messageyoubeep' | translate:{$a: message.beepWho} }}
|
||||||
</span>
|
</span>
|
||||||
|
@ -63,7 +63,7 @@
|
||||||
|
|
||||||
<ion-badge class="ion-text-wrap" color="info" *ngIf="!message.issystem && !message.beep">
|
<ion-badge class="ion-text-wrap" color="info" *ngIf="!message.issystem && !message.beep">
|
||||||
<span>
|
<span>
|
||||||
<ion-icon name="fas-asterisk"></ion-icon>
|
<ion-icon name="fas-asterisk" aria-hidden="true"></ion-icon>
|
||||||
{{ message.timestamp * 1000 | coreFormatDate:"strftimetime" }}
|
{{ message.timestamp * 1000 | coreFormatDate:"strftimetime" }}
|
||||||
<strong>
|
<strong>
|
||||||
{{ message.userfullname }} <core-format-text [text]="message.message" contextLevel="module"
|
{{ message.userfullname }} <core-format-text [text]="message.message" contextLevel="module"
|
||||||
|
|
|
@ -35,7 +35,7 @@
|
||||||
<!-- Activity availability messages -->
|
<!-- Activity availability messages -->
|
||||||
<ion-card class="core-info-card" *ngIf="choiceNotOpenYet">
|
<ion-card class="core-info-card" *ngIf="choiceNotOpenYet">
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-icon name="fas-info-circle" slot="start"></ion-icon>
|
<ion-icon name="fas-info-circle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<p *ngIf="options.length">{{ 'addon.mod_choice.previewonly' | translate:{$a: openTimeReadable} }}</p>
|
<p *ngIf="options.length">{{ 'addon.mod_choice.previewonly' | translate:{$a: openTimeReadable} }}</p>
|
||||||
<p *ngIf="!options.length">{{ 'addon.mod_choice.notopenyet' | translate:{$a: openTimeReadable} }}</p>
|
<p *ngIf="!options.length">{{ 'addon.mod_choice.notopenyet' | translate:{$a: openTimeReadable} }}</p>
|
||||||
|
@ -45,7 +45,7 @@
|
||||||
|
|
||||||
<ion-card class="core-info-card" *ngIf="choiceClosed">
|
<ion-card class="core-info-card" *ngIf="choiceClosed">
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-icon name="fas-info-circle" slot="start"></ion-icon>
|
<ion-icon name="fas-info-circle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<p *ngIf="options.length">
|
<p *ngIf="options.length">
|
||||||
{{ 'addon.mod_choice.yourselection' | translate }}
|
{{ 'addon.mod_choice.yourselection' | translate }}
|
||||||
|
@ -61,7 +61,7 @@
|
||||||
<!-- Choice done in offline but not synchronized -->
|
<!-- Choice done in offline but not synchronized -->
|
||||||
<ion-card class="core-warning-card" *ngIf="hasOffline">
|
<ion-card class="core-warning-card" *ngIf="hasOffline">
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-icon name="fas-exclamation-triangle" slot="start"></ion-icon>
|
<ion-icon name="fas-exclamation-triangle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>{{ 'core.hasdatatosync' | translate:{$a: moduleName} }}</ion-label>
|
<ion-label>{{ 'core.hasdatatosync' | translate:{$a: moduleName} }}</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
@ -69,7 +69,7 @@
|
||||||
<!-- Inform what will happen with the choices. -->
|
<!-- Inform what will happen with the choices. -->
|
||||||
<ion-card class="core-info-card" *ngIf="canEdit && publishInfo && options.length">
|
<ion-card class="core-info-card" *ngIf="canEdit && publishInfo && options.length">
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-icon name="fas-info-circle" slot="start"></ion-icon>
|
<ion-icon name="fas-info-circle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>{{ publishInfo | translate }}</ion-label>
|
<ion-label>{{ publishInfo | translate }}</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
@ -111,7 +111,7 @@
|
||||||
<ion-row>
|
<ion-row>
|
||||||
<ion-col size="12" size-lg="5">
|
<ion-col size="12" size-lg="5">
|
||||||
<ion-item class="ion-text-wrap core-warning-item" *ngIf="hasOffline">
|
<ion-item class="ion-text-wrap core-warning-item" *ngIf="hasOffline">
|
||||||
<ion-icon slot="start" name="fas-exclamation-triangle" color="warning"></ion-icon>
|
<ion-icon slot="start" name="fas-exclamation-triangle" color="warning" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>{{ 'addon.mod_choice.resultsnotsynced' | translate }}</ion-label>
|
<ion-label>{{ 'addon.mod_choice.resultsnotsynced' | translate }}</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ion-item>
|
<ion-item>
|
||||||
|
@ -153,7 +153,7 @@
|
||||||
|
|
||||||
<ion-card class="core-info-card" *ngIf="!canSeeResults && !choiceNotOpenYet">
|
<ion-card class="core-info-card" *ngIf="!canSeeResults && !choiceNotOpenYet">
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-icon name="fas-info-circle" slot="start"></ion-icon>
|
<ion-icon name="fas-info-circle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label><p>{{ 'addon.mod_choice.noresultsviewable' | translate }}</p></ion-label>
|
<ion-label><p>{{ 'addon.mod_choice.noresultsviewable' | translate }}</p></ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
|
|
@ -1,26 +1,26 @@
|
||||||
<ion-button *ngIf="action == 'more'" fill="clear" (click)="viewEntry()" [title]="'addon.mod_data.more' | translate">
|
<ion-button *ngIf="action == 'more'" fill="clear" (click)="viewEntry()" [attr.aria-label]="'addon.mod_data.more' | translate">
|
||||||
<ion-icon name="fas-search" slot="icon-only"></ion-icon>
|
<ion-icon name="fas-search" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
|
|
||||||
<ion-button *ngIf="action == 'edit'" fill="clear" (click)="editEntry()" [title]="'core.edit' | translate">
|
<ion-button *ngIf="action == 'edit'" fill="clear" (click)="editEntry()" [attr.aria-label]="'core.edit' | translate">
|
||||||
<ion-icon name="fas-cog" slot="icon-only"></ion-icon>
|
<ion-icon name="fas-cog" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
|
|
||||||
<ion-button *ngIf="action == 'delete' && !entry.deleted" fill="clear" (click)="deleteEntry()" [title]="'core.delete' | translate">
|
<ion-button *ngIf="action == 'delete' && !entry.deleted" fill="clear" (click)="deleteEntry()" [attr.aria-label]="'core.delete' | translate">
|
||||||
<ion-icon name="fas-trash" slot="icon-only"></ion-icon>
|
<ion-icon name="fas-trash" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
|
|
||||||
<ion-button *ngIf="action == 'delete' && entry.deleted" fill="clear" (click)="undoDelete()" [title]="'core.restore' | translate">
|
<ion-button *ngIf="action == 'delete' && entry.deleted" fill="clear" (click)="undoDelete()" [attr.aria-label]="'core.restore' | translate">
|
||||||
<ion-icon name="fas-undo-alt" slot="icon-only"></ion-icon>
|
<ion-icon name="fas-undo-alt" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
|
|
||||||
<ion-button *ngIf="action == 'approve'" fill="clear" (click)="approveEntry()" [title]="'addon.mod_data.approve' | translate">
|
<ion-button *ngIf="action == 'approve'" fill="clear" (click)="approveEntry()" [attr.aria-label]="'addon.mod_data.approve' | translate">
|
||||||
<ion-icon name="fas-thumbs-up" slot="icon-only"></ion-icon>
|
<ion-icon name="fas-thumbs-up" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
|
|
||||||
<ion-button *ngIf="action == 'disapprove'" fill="clear" (click)="disapproveEntry()"
|
<ion-button *ngIf="action == 'disapprove'" fill="clear" (click)="disapproveEntry()"
|
||||||
[title]="'addon.mod_data.disapprove' | translate">
|
[attr.aria-label]="'addon.mod_data.disapprove' | translate">
|
||||||
<ion-icon name="far-thumbs-down" slot="icon-only"></ion-icon>
|
<ion-icon name="far-thumbs-down" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
|
|
||||||
<core-comments *ngIf="action == 'comments' && mode == 'list'" contextLevel="module" [instanceId]="database.coursemodule"
|
<core-comments *ngIf="action == 'comments' && mode == 'list'" contextLevel="module" [instanceId]="database.coursemodule"
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<!-- Buttons to add to the header. -->
|
<!-- Buttons to add to the header. -->
|
||||||
<core-navbar-buttons slot="end">
|
<core-navbar-buttons slot="end">
|
||||||
<ion-button *ngIf="canSearch" (click)="showSearch()" [attr.aria-label]="'addon.mod_data.search' | translate">
|
<ion-button *ngIf="canSearch" (click)="showSearch()" [attr.aria-label]="'addon.mod_data.search' | translate">
|
||||||
<ion-icon name="fas-search" slot="icon-only"></ion-icon>
|
<ion-icon name="fas-search" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
<core-context-menu>
|
<core-context-menu>
|
||||||
<core-context-menu-item *ngIf="externalUrl" [priority]="900" [content]="'core.openinbrowser' | translate"
|
<core-context-menu-item *ngIf="externalUrl" [priority]="900" [content]="'core.openinbrowser' | translate"
|
||||||
|
@ -46,7 +46,7 @@
|
||||||
<!-- Data done in offline but not synchronized -->
|
<!-- Data done in offline but not synchronized -->
|
||||||
<ion-card class="core-warning-card" *ngIf="hasOffline || hasOfflineRatings">
|
<ion-card class="core-warning-card" *ngIf="hasOffline || hasOfflineRatings">
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-icon name="fas-exclamation-triangle" slot="start"></ion-icon>
|
<ion-icon name="fas-exclamation-triangle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>{{ 'core.hasdatatosync' | translate: {$a: moduleName} }}</ion-label>
|
<ion-label>{{ 'core.hasdatatosync' | translate: {$a: moduleName} }}</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
@ -66,21 +66,21 @@
|
||||||
|
|
||||||
<ion-card class="core-info-card" *ngIf="!access?.timeavailable && timeAvailableFrom">
|
<ion-card class="core-info-card" *ngIf="!access?.timeavailable && timeAvailableFrom">
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-icon name="fas-info-circle" slot="start"></ion-icon>
|
<ion-icon name="fas-info-circle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>{{ 'addon.mod_data.notopenyet' | translate:{$a: timeAvailableFromReadable} }}</ion-label>
|
<ion-label>{{ 'addon.mod_data.notopenyet' | translate:{$a: timeAvailableFromReadable} }}</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
|
||||||
<ion-card class="core-info-card" *ngIf="!access?.timeavailable && timeAvailableTo">
|
<ion-card class="core-info-card" *ngIf="!access?.timeavailable && timeAvailableTo">
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-icon name="fas-info-circle" slot="start"></ion-icon>
|
<ion-icon name="fas-info-circle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>{{ 'addon.mod_data.expired' | translate:{$a: timeAvailableToReadable} }}</ion-label>
|
<ion-label>{{ 'addon.mod_data.expired' | translate:{$a: timeAvailableToReadable} }}</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
|
||||||
<ion-card class="core-info-card" *ngIf="access && access.entrieslefttoview">>
|
<ion-card class="core-info-card" *ngIf="access && access.entrieslefttoview">>
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-icon name="fas-info-circle" slot="start"></ion-icon>
|
<ion-icon name="fas-info-circle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>
|
<ion-label>
|
||||||
{{ 'addon.mod_data.entrieslefttoaddtoview' | translate:{$a: {entrieslefttoview: access.entrieslefttoview} } }}
|
{{ 'addon.mod_data.entrieslefttoaddtoview' | translate:{$a: {entrieslefttoview: access.entrieslefttoview} } }}
|
||||||
</ion-label>
|
</ion-label>
|
||||||
|
@ -89,7 +89,7 @@
|
||||||
|
|
||||||
<ion-card class="core-info-card" *ngIf="access && access.entrieslefttoadd">>
|
<ion-card class="core-info-card" *ngIf="access && access.entrieslefttoadd">>
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-icon name="fas-info-circle" slot="start"></ion-icon>
|
<ion-icon name="fas-info-circle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>
|
<ion-label>
|
||||||
{{ 'addon.mod_data.entrieslefttoadd' | translate:{$a: {entriesleft: access.entrieslefttoadd} } }}
|
{{ 'addon.mod_data.entrieslefttoadd' | translate:{$a: {entriesleft: access.entrieslefttoadd} } }}
|
||||||
</ion-label>
|
</ion-label>
|
||||||
|
@ -121,14 +121,14 @@
|
||||||
<ion-row class="ion-align-items-center">
|
<ion-row class="ion-align-items-center">
|
||||||
<ion-col *ngIf="search.page > 0">
|
<ion-col *ngIf="search.page > 0">
|
||||||
<ion-button expand="block" fill="outline" (click)="searchEntries(search.page - 1)">
|
<ion-button expand="block" fill="outline" (click)="searchEntries(search.page - 1)">
|
||||||
<ion-icon name="fas-chevron-left" slot="start"></ion-icon>
|
<ion-icon name="fas-chevron-left" slot="start" aria-hidden="true"></ion-icon>
|
||||||
{{ 'core.previous' | translate }}
|
{{ 'core.previous' | translate }}
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-col>
|
</ion-col>
|
||||||
<ion-col *ngIf="hasNextPage">
|
<ion-col *ngIf="hasNextPage">
|
||||||
<ion-button expand="block" (click)="searchEntries(search.page + 1)">
|
<ion-button expand="block" (click)="searchEntries(search.page + 1)">
|
||||||
{{ 'core.next' | translate }}
|
{{ 'core.next' | translate }}
|
||||||
<ion-icon name="fas-chevron-right" slot="end"></ion-icon>
|
<ion-icon name="fas-chevron-right" slot="end" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-col>
|
</ion-col>
|
||||||
</ion-row>
|
</ion-row>
|
||||||
|
@ -146,6 +146,6 @@
|
||||||
|
|
||||||
<ion-fab slot="fixed" core-fab vertical="bottom" horizontal="end" *ngIf="canAdd">
|
<ion-fab slot="fixed" core-fab vertical="bottom" horizontal="end" *ngIf="canAdd">
|
||||||
<ion-fab-button (click)="gotoAddEntries()" [attr.aria-label]="'addon.mod_data.addentries' | translate">
|
<ion-fab-button (click)="gotoAddEntries()" [attr.aria-label]="'addon.mod_data.addentries' | translate">
|
||||||
<ion-icon name="fas-plus"></ion-icon>
|
<ion-icon name="fas-plus" aria-hidden="true"></ion-icon>
|
||||||
</ion-fab-button>
|
</ion-fab-button>
|
||||||
</ion-fab>
|
</ion-fab>
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
<ion-title>{{ 'addon.mod_data.search' | translate }}</ion-title>
|
<ion-title>{{ 'addon.mod_data.search' | translate }}</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
<ion-button (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
||||||
<ion-icon name="fas-times" slot="icon-only"></ion-icon>
|
<ion-icon name="fas-times" slot="icon-only" aria-hidden=true></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
|
@ -60,7 +60,7 @@
|
||||||
</ion-list>
|
</ion-list>
|
||||||
<div class="ion-padding">
|
<div class="ion-padding">
|
||||||
<ion-button expand="block" type="submit">
|
<ion-button expand="block" type="submit">
|
||||||
<ion-icon name="fas-search" slot="start"></ion-icon>
|
<ion-icon name="fas-search" slot="start" aria-hidden="true"></ion-icon>
|
||||||
{{ 'addon.mod_data.search' | translate }}
|
{{ 'addon.mod_data.search' | translate }}
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="addon-data-latlong" *ngIf="locationServicesEnabled">
|
<div class="addon-data-latlong" *ngIf="locationServicesEnabled">
|
||||||
<ion-button (click)="getLocation($event)">
|
<ion-button (click)="getLocation($event)">
|
||||||
<ion-icon name="fas-crosshairs" slot="start"></ion-icon>
|
<ion-icon name="fas-crosshairs" slot="start" aria-hidden="true"></ion-icon>
|
||||||
{{ 'addon.mod_data.mylocation' | translate }}
|
{{ 'addon.mod_data.mylocation' | translate }}
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
<!-- Database entries found to be synchronized -->
|
<!-- Database entries found to be synchronized -->
|
||||||
<ion-card class="core-warning-card" *ngIf="entry && entry.hasOffline">
|
<ion-card class="core-warning-card" *ngIf="entry && entry.hasOffline">
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-icon name="fas-exclamation-triangle" slot="start"></ion-icon>
|
<ion-icon name="fas-exclamation-triangle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>{{ 'core.hasdatatosync' | translate: {$a: moduleName} }}</ion-label>
|
<ion-label>{{ 'core.hasdatatosync' | translate: {$a: moduleName} }}</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
@ -66,14 +66,14 @@
|
||||||
<ion-row class="ion-align-items-center">
|
<ion-row class="ion-align-items-center">
|
||||||
<ion-col *ngIf="hasPrevious">
|
<ion-col *ngIf="hasPrevious">
|
||||||
<ion-button expand="block" fill="outline" (click)="gotoEntry(offset! -1)">
|
<ion-button expand="block" fill="outline" (click)="gotoEntry(offset! -1)">
|
||||||
<ion-icon name="fas-chevron-left" slot="start"></ion-icon>
|
<ion-icon name="fas-chevron-left" slot="start" aria-hidden="true"></ion-icon>
|
||||||
{{ 'core.previous' | translate }}
|
{{ 'core.previous' | translate }}
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-col>
|
</ion-col>
|
||||||
<ion-col *ngIf="hasNext">
|
<ion-col *ngIf="hasNext">
|
||||||
<ion-button expand="block" (click)="gotoEntry(offset! + 1)">
|
<ion-button expand="block" (click)="gotoEntry(offset! + 1)">
|
||||||
{{ 'core.next' | translate }}
|
{{ 'core.next' | translate }}
|
||||||
<ion-icon name="fas-chevron-right" slot="end"></ion-icon>
|
<ion-icon name="fas-chevron-right" slot="end" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-col>
|
</ion-col>
|
||||||
</ion-row>
|
</ion-row>
|
||||||
|
|
|
@ -97,21 +97,21 @@
|
||||||
<!-- Feedback done in offline but not synchronized -->
|
<!-- Feedback done in offline but not synchronized -->
|
||||||
<ion-card class="core-warning-card" *ngIf="hasOffline">
|
<ion-card class="core-warning-card" *ngIf="hasOffline">
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-icon name="fas-exclamation-triangle" slot="start"></ion-icon>
|
<ion-icon name="fas-exclamation-triangle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>{{ 'core.hasdatatosync' | translate:{$a: moduleName} }}</ion-label>
|
<ion-label>{{ 'core.hasdatatosync' | translate:{$a: moduleName} }}</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
|
||||||
<ion-card class="core-info-card" *ngIf="access && access.cancomplete && !access.isopen">
|
<ion-card class="core-info-card" *ngIf="access && access.cancomplete && !access.isopen">
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-icon name="fas-question-circle" slot="start"></ion-icon>
|
<ion-icon name="fas-question-circle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>{{ 'addon.mod_feedback.feedback_is_not_open' | translate }}</ion-label>
|
<ion-label>{{ 'addon.mod_feedback.feedback_is_not_open' | translate }}</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
|
||||||
<ion-card class="core-success-card" *ngIf="access && access.cancomplete && access.isopen && !access.cansubmit">
|
<ion-card class="core-success-card" *ngIf="access && access.cancomplete && access.isopen && !access.cansubmit">
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-icon name="fas-check" slot="start"></ion-icon>
|
<ion-icon name="fas-check" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>{{ 'addon.mod_feedback.this_feedback_is_already_submitted' | translate }}</ion-label>
|
<ion-label>{{ 'addon.mod_feedback.this_feedback_is_already_submitted' | translate }}</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
@ -149,7 +149,7 @@
|
||||||
<ion-row class="ion-align-items-center">
|
<ion-row class="ion-align-items-center">
|
||||||
<ion-col>
|
<ion-col>
|
||||||
<ion-button expand="block" fill="outline" (click)="gotoAnswerQuestions(true)" class="ion-text-wrap">
|
<ion-button expand="block" fill="outline" (click)="gotoAnswerQuestions(true)" class="ion-text-wrap">
|
||||||
<ion-icon name="fas-search" slot="start"></ion-icon>
|
<ion-icon name="fas-search" slot="start" aria-hidden="true"></ion-icon>
|
||||||
{{ 'addon.mod_feedback.preview' | translate }}
|
{{ 'addon.mod_feedback.preview' | translate }}
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-col>
|
</ion-col>
|
||||||
|
@ -161,7 +161,7 @@
|
||||||
<ng-container *ngIf="goPage">
|
<ng-container *ngIf="goPage">
|
||||||
{{ 'addon.mod_feedback.continue_the_form' | translate }}
|
{{ 'addon.mod_feedback.continue_the_form' | translate }}
|
||||||
</ng-container>
|
</ng-container>
|
||||||
<ion-icon name="fas-chevron-right" slot="end"></ion-icon>
|
<ion-icon name="fas-chevron-right" slot="end" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-col>
|
</ion-col>
|
||||||
</ion-row>
|
</ion-row>
|
||||||
|
@ -180,7 +180,7 @@
|
||||||
<ng-container *ngIf="access && (access.canedititems || !access.isempty)">
|
<ng-container *ngIf="access && (access.canedititems || !access.isempty)">
|
||||||
<ion-card class="core-info-card" *ngIf="warning">
|
<ion-card class="core-info-card" *ngIf="warning">
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-icon name="fas-question-circle" slot="start"></ion-icon>
|
<ion-icon name="fas-question-circle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>{{ warning }}</ion-label>
|
<ion-label>{{ warning }}</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
|
|
@ -106,7 +106,7 @@
|
||||||
</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>
|
||||||
<ion-icon name="fas-exclamation-triangle" slot="start"></ion-icon>
|
<ion-icon name="fas-exclamation-triangle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>{{ 'addon.mod_feedback.captchaofflinewarning' | translate }}</ion-label>
|
<ion-label>{{ 'addon.mod_feedback.captchaofflinewarning' | translate }}</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</div>
|
</div>
|
||||||
|
@ -117,14 +117,14 @@
|
||||||
<ion-row class="ion-align-items-center">
|
<ion-row class="ion-align-items-center">
|
||||||
<ion-col *ngIf="hasPrevPage">
|
<ion-col *ngIf="hasPrevPage">
|
||||||
<ion-button expand="block" fill="outline" (click)="gotoPage(true)" class="ion-text-wrap">
|
<ion-button expand="block" fill="outline" (click)="gotoPage(true)" class="ion-text-wrap">
|
||||||
<ion-icon name="fas-chevron-left" slot="start"></ion-icon>
|
<ion-icon name="fas-chevron-left" slot="start" aria-hidden="true"></ion-icon>
|
||||||
{{ 'addon.mod_feedback.previous_page' | translate }}
|
{{ 'addon.mod_feedback.previous_page' | translate }}
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-col>
|
</ion-col>
|
||||||
<ion-col *ngIf="hasNextPage">
|
<ion-col *ngIf="hasNextPage">
|
||||||
<ion-button expand="block" (click)="gotoPage(false)" class="ion-text-wrap">
|
<ion-button expand="block" (click)="gotoPage(false)" class="ion-text-wrap">
|
||||||
{{ 'addon.mod_feedback.next_page' | translate }}
|
{{ 'addon.mod_feedback.next_page' | translate }}
|
||||||
<ion-icon name="fas-chevron-right" slot="end"></ion-icon>
|
<ion-icon name="fas-chevron-right" slot="end" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-col>
|
</ion-col>
|
||||||
<ion-col *ngIf="!hasNextPage">
|
<ion-col *ngIf="!hasNextPage">
|
||||||
|
@ -139,7 +139,7 @@
|
||||||
|
|
||||||
<ion-card class="core-success-card" *ngIf="completed">
|
<ion-card class="core-success-card" *ngIf="completed">
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-icon name="fas-check" slot="start"></ion-icon>
|
<ion-icon name="fas-check" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<p *ngIf="!completionPageContents && !completedOffline">
|
<p *ngIf="!completionPageContents && !completedOffline">
|
||||||
{{ 'addon.mod_feedback.this_feedback_is_already_submitted' | translate }}
|
{{ 'addon.mod_feedback.this_feedback_is_already_submitted' | translate }}
|
||||||
|
@ -161,14 +161,14 @@
|
||||||
<ion-row class="ion-align-items-center">
|
<ion-row class="ion-align-items-center">
|
||||||
<ion-col *ngIf="access!.canviewanalysis">
|
<ion-col *ngIf="access!.canviewanalysis">
|
||||||
<ion-button expand="block" fill="outline" (click)="showAnalysis()" class="ion-text-wrap">
|
<ion-button expand="block" fill="outline" (click)="showAnalysis()" class="ion-text-wrap">
|
||||||
<ion-icon name="fas-chart-bar" slot="start"></ion-icon>
|
<ion-icon name="fas-chart-bar" slot="start" aria-hidden="true"></ion-icon>
|
||||||
{{ 'addon.mod_feedback.completed_feedbacks' | translate }}
|
{{ 'addon.mod_feedback.completed_feedbacks' | translate }}
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-col>
|
</ion-col>
|
||||||
<ion-col *ngIf="hasNextPage">
|
<ion-col *ngIf="hasNextPage">
|
||||||
<ion-button expand="block" (click)="continue()" class="ion-text-wrap">
|
<ion-button expand="block" (click)="continue()" class="ion-text-wrap">
|
||||||
{{ 'core.continue' | translate }}
|
{{ 'core.continue' | translate }}
|
||||||
<ion-icon name="fas-chevron-right" slot="end"></ion-icon>
|
<ion-icon name="fas-chevron-right" slot="end" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-col>
|
</ion-col>
|
||||||
</ion-row>
|
</ion-row>
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
<ion-list *ngIf="subfolder && (subfolder!.files.length + subfolder!.folders.length > 0)">
|
<ion-list *ngIf="subfolder && (subfolder!.files.length + subfolder!.folders.length > 0)">
|
||||||
<ng-container *ngFor="let folder of subfolder!.folders">
|
<ng-container *ngFor="let folder of subfolder!.folders">
|
||||||
<ion-item class="item-file" (click)="openFolder(folder)" detail="true" button>
|
<ion-item class="item-file" (click)="openFolder(folder)" detail="true" button>
|
||||||
<ion-icon name="fas-folder" slot="start"></ion-icon>
|
<ion-icon name="fas-folder" slot="start" [attr.aria-label]="'core.folder' | translate"></ion-icon>
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<h2>{{folder.filename}}</h2>
|
<h2>{{folder.filename}}</h2>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
|
|
|
@ -1,35 +1,35 @@
|
||||||
<ion-item class="ion-text-wrap" (click)="setLockState(true)" *ngIf="discussion.canlock && !discussion.locked">
|
<ion-item class="ion-text-wrap" (click)="setLockState(true)" *ngIf="discussion.canlock && !discussion.locked">
|
||||||
<ion-icon name="fa-lock" slot="start"></ion-icon>
|
<ion-icon name="fa-lock" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<h2>{{ 'addon.mod_forum.lockdiscussion' | translate }}</h2>
|
<h2>{{ 'addon.mod_forum.lockdiscussion' | translate }}</h2>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ion-item class="ion-text-wrap" (click)="setLockState(false)" *ngIf="discussion.canlock && discussion.locked">
|
<ion-item class="ion-text-wrap" (click)="setLockState(false)" *ngIf="discussion.canlock && discussion.locked">
|
||||||
<ion-icon name="fa-unlock" slot="start"></ion-icon>
|
<ion-icon name="fa-unlock" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<h2>{{ 'addon.mod_forum.unlockdiscussion' | translate }}</h2>
|
<h2>{{ 'addon.mod_forum.unlockdiscussion' | translate }}</h2>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ion-item class="ion-text-wrap" (click)="setPinState(true)" *ngIf="canPin && !discussion.pinned">
|
<ion-item class="ion-text-wrap" (click)="setPinState(true)" *ngIf="canPin && !discussion.pinned">
|
||||||
<ion-icon name="fa-map-pin" slot="start"></ion-icon>
|
<ion-icon name="fa-map-pin" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<h2>{{ 'addon.mod_forum.pindiscussion' | translate }}</h2>
|
<h2>{{ 'addon.mod_forum.pindiscussion' | translate }}</h2>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ion-item class="ion-text-wrap" (click)="setPinState(false)" *ngIf="canPin && discussion.pinned">
|
<ion-item class="ion-text-wrap" (click)="setPinState(false)" *ngIf="canPin && discussion.pinned">
|
||||||
<ion-icon name="fa-map-pin" slot="start" class="icon-slash"></ion-icon>
|
<ion-icon name="fa-map-pin" slot="start" class="icon-slash" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<h2>{{ 'addon.mod_forum.unpindiscussion' | translate }}</h2>
|
<h2>{{ 'addon.mod_forum.unpindiscussion' | translate }}</h2>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ion-item class="ion-text-wrap" (click)="toggleFavouriteState(true)" *ngIf="discussion.canfavourite && !discussion.starred">
|
<ion-item class="ion-text-wrap" (click)="toggleFavouriteState(true)" *ngIf="discussion.canfavourite && !discussion.starred">
|
||||||
<ion-icon name="fa-star" slot="start"></ion-icon>
|
<ion-icon name="fa-star" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<h2>{{ 'addon.mod_forum.addtofavourites' | translate }}</h2>
|
<h2>{{ 'addon.mod_forum.addtofavourites' | translate }}</h2>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ion-item class="ion-text-wrap" (click)="toggleFavouriteState(false)" *ngIf="discussion.canfavourite && discussion.starred">
|
<ion-item class="ion-text-wrap" (click)="toggleFavouriteState(false)" *ngIf="discussion.canfavourite && discussion.starred">
|
||||||
<ion-icon name="fa-star" slot="start" class="icon-slash"></ion-icon>
|
<ion-icon name="fa-star" slot="start" class="icon-slash" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<h2>{{ 'addon.mod_forum.removefromfavourites' | translate }}</h2>
|
<h2>{{ 'addon.mod_forum.removefromfavourites' | translate }}</h2>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
<ion-title>{{ 'addon.mod_forum.yourreply' | translate }}</ion-title>
|
<ion-title>{{ 'addon.mod_forum.yourreply' | translate }}</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
<ion-button (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
||||||
<ion-icon name="close" slot="icon-only"></ion-icon>
|
<ion-icon name="fas-times" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
|
@ -25,9 +25,10 @@
|
||||||
(contentChanged)="onMessageChange($event)">
|
(contentChanged)="onMessageChange($event)">
|
||||||
</core-rich-text-editor>
|
</core-rich-text-editor>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ion-item-divider class="ion-text-wrap core-expandable" (click)="toggleAdvanced()">
|
<ion-item-divider class="ion-text-wrap core-expandable" (click)="toggleAdvanced()"
|
||||||
<ion-icon *ngIf="!advanced" name="fa-caret-right" slot="start"></ion-icon>
|
[attr.aria-expanded]="advanced" [attr.aria-label]="(advanced ? 'core.hideadvanced' : 'core.showadvanced') |translate">
|
||||||
<ion-icon *ngIf="advanced" name="fa-caret-down" slot="start"></ion-icon>
|
<ion-icon *ngIf="!advanced" name="fa-caret-right" slot="start" aria-hidden="true"></ion-icon>
|
||||||
|
<ion-icon *ngIf="advanced" name="fa-caret-down" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>{{ 'addon.mod_forum.advanced' | translate }}</ion-label>
|
<ion-label>{{ 'addon.mod_forum.advanced' | translate }}</ion-label>
|
||||||
</ion-item-divider>
|
</ion-item-divider>
|
||||||
<ng-container *ngIf="advanced">
|
<ng-container *ngIf="advanced">
|
||||||
|
|
|
@ -50,7 +50,7 @@
|
||||||
<!-- Forum discussions found to be synchronized -->
|
<!-- Forum discussions found to be synchronized -->
|
||||||
<ion-card class="core-warning-card" *ngIf="hasOffline || hasOfflineRatings">
|
<ion-card class="core-warning-card" *ngIf="hasOffline || hasOfflineRatings">
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-icon name="fas-exclamation-triangle" slot="start"></ion-icon>
|
<ion-icon name="fas-exclamation-triangle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>{{ 'core.hasdatatosync' | translate:{$a: moduleName} }}</ion-label>
|
<ion-label>{{ 'core.hasdatatosync' | translate:{$a: moduleName} }}</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
@ -58,7 +58,7 @@
|
||||||
<!-- Cut-off date or due date message -->
|
<!-- Cut-off date or due date message -->
|
||||||
<ion-card class="core-info-card" *ngIf="availabilityMessage">
|
<ion-card class="core-info-card" *ngIf="availabilityMessage">
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-icon name="fas-info-circle" slot="start"></ion-icon>
|
<ion-icon name="fas-info-circle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>{{ availabilityMessage }}</ion-label>
|
<ion-label>{{ availabilityMessage }}</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
@ -85,8 +85,10 @@
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<div class="addon-mod-forum-discussion-title">
|
<div class="addon-mod-forum-discussion-title">
|
||||||
<h2 class="ion-text-wrap">
|
<h2 class="ion-text-wrap">
|
||||||
<ion-icon name="fa-map-pin" *ngIf="discussion.pinned"></ion-icon>
|
<ion-icon name="fa-map-pin" *ngIf="discussion.pinned"
|
||||||
<ion-icon name="fa-star" class="addon-forum-star" *ngIf="!discussion.pinned && discussion.starred"></ion-icon>
|
[attr.aria-label]="'addon.mod_forum.discussionpinned' | translate"></ion-icon>
|
||||||
|
<ion-icon name="fa-star" class="addon-forum-star" *ngIf="!discussion.pinned && discussion.starred"
|
||||||
|
[attr.aria-label]="'addon.mod_forum.favourites' | translate"></ion-icon>
|
||||||
<core-format-text
|
<core-format-text
|
||||||
[text]="discussion.subject"
|
[text]="discussion.subject"
|
||||||
contextLevel="module" [contextInstanceId]="module && module.id" [courseId]="courseId">
|
contextLevel="module" [contextInstanceId]="module && module.id" [courseId]="courseId">
|
||||||
|
@ -96,7 +98,7 @@
|
||||||
fill="clear" color="dark"
|
fill="clear" color="dark"
|
||||||
[attr.aria-label]="('core.displayoptions' | translate)"
|
[attr.aria-label]="('core.displayoptions' | translate)"
|
||||||
(click)="showOptionsMenu($event, discussion)">
|
(click)="showOptionsMenu($event, discussion)">
|
||||||
<ion-icon name="ellipsis-vertical" slot="icon-only">
|
<ion-icon name="ellipsis-vertical" slot="icon-only" aria-hidden="true">
|
||||||
</ion-icon>
|
</ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</div>
|
</div>
|
||||||
|
@ -105,12 +107,15 @@
|
||||||
</core-user-avatar>
|
</core-user-avatar>
|
||||||
<div class="addon-mod-forum-discussion-author">
|
<div class="addon-mod-forum-discussion-author">
|
||||||
<h3 *ngIf="discussion.userfullname">{{discussion.userfullname}}</h3>
|
<h3 *ngIf="discussion.userfullname">{{discussion.userfullname}}</h3>
|
||||||
<p *ngIf="discussion.groupname"><ion-icon name="people"></ion-icon> {{ discussion.groupname }}</p>
|
<p *ngIf="discussion.groupname">
|
||||||
|
<ion-icon name="fas-users" [attr.aria-label]="'addon.mod_forum.group' | translate">
|
||||||
|
</ion-icon> {{ discussion.groupname }}
|
||||||
|
</p>
|
||||||
<p *ngIf="discussions.isOnlineDiscussion(discussion)">
|
<p *ngIf="discussions.isOnlineDiscussion(discussion)">
|
||||||
{{discussion.created * 1000 | coreFormatDate: "strftimerecentfull"}}
|
{{discussion.created * 1000 | coreFormatDate: "strftimerecentfull"}}
|
||||||
</p>
|
</p>
|
||||||
<p *ngIf="discussions.isOfflineDiscussion(discussion)">
|
<p *ngIf="discussions.isOfflineDiscussion(discussion)">
|
||||||
<ion-icon name="fas-clock"></ion-icon>
|
<ion-icon name="fas-clock" aria-hidden="true"></ion-icon>
|
||||||
{{ 'core.notsent' | translate }}
|
{{ 'core.notsent' | translate }}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
@ -119,7 +124,7 @@
|
||||||
class="ion-text-center addon-mod-forum-discussion-more-info">
|
class="ion-text-center addon-mod-forum-discussion-more-info">
|
||||||
<ion-col class="ion-text-start">
|
<ion-col class="ion-text-start">
|
||||||
<ion-note>
|
<ion-note>
|
||||||
<ion-icon name="fas-clock"></ion-icon> {{ 'addon.mod_forum.lastpost' | translate }}
|
<ion-icon name="fas-clock" aria-hidden="true"></ion-icon> {{ 'addon.mod_forum.lastpost' | translate }}
|
||||||
<ng-container *ngIf="discussion.timemodified > discussion.created">
|
<ng-container *ngIf="discussion.timemodified > discussion.created">
|
||||||
{{ discussion.timemodified | coreTimeAgo }}
|
{{ discussion.timemodified | coreTimeAgo }}
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
@ -130,7 +135,7 @@
|
||||||
</ion-col>
|
</ion-col>
|
||||||
<ion-col class="ion-text-end">
|
<ion-col class="ion-text-end">
|
||||||
<ion-note>
|
<ion-note>
|
||||||
<ion-icon name="fas-comments"></ion-icon>
|
<ion-icon name="fas-comments" aria-hidden="true"></ion-icon>
|
||||||
{{ 'addon.mod_forum.numreplies' | translate:{numreplies: discussion.numreplies} }}
|
{{ 'addon.mod_forum.numreplies' | translate:{numreplies: discussion.numreplies} }}
|
||||||
<ion-badge *ngIf="discussion.numunread" class="ion-text-center"
|
<ion-badge *ngIf="discussion.numunread" class="ion-text-center"
|
||||||
[attr.aria-label]="'addon.mod_forum.unreadpostsnumber' | translate:{ '$a' : discussion.numunread}">
|
[attr.aria-label]="'addon.mod_forum.unreadpostsnumber' | translate:{ '$a' : discussion.numunread}">
|
||||||
|
@ -151,7 +156,7 @@
|
||||||
|
|
||||||
<ion-fab slot="fixed" core-fab vertical="bottom" horizontal="end" *ngIf="forum && canAddDiscussion">
|
<ion-fab slot="fixed" core-fab vertical="bottom" horizontal="end" *ngIf="forum && canAddDiscussion">
|
||||||
<ion-fab-button (click)="openNewDiscussion()" [attr.aria-label]="addDiscussionText">
|
<ion-fab-button (click)="openNewDiscussion()" [attr.aria-label]="addDiscussionText">
|
||||||
<ion-icon name="fas-plus"></ion-icon>
|
<ion-icon name="fas-plus" aria-hidden="true"></ion-icon>
|
||||||
</ion-fab-button>
|
</ion-fab-button>
|
||||||
</ion-fab>
|
</ion-fab>
|
||||||
</core-split-view>
|
</core-split-view>
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
<core-loading [hideUntil]="loaded" class="core-loading-center">
|
<core-loading [hideUntil]="loaded" class="core-loading-center">
|
||||||
<ion-item class="ion-text-wrap" (click)="editPost()" *ngIf="offlinePost || (canEdit && isOnline)">
|
<ion-item class="ion-text-wrap" (click)="editPost()" *ngIf="offlinePost || (canEdit && isOnline)">
|
||||||
<ion-icon name="create" slot="start"></ion-icon>
|
<ion-icon name="fas-pen" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<h2>{{ 'addon.mod_forum.edit' | translate }}</h2>
|
<h2>{{ 'addon.mod_forum.edit' | translate }}</h2>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ion-item class="ion-text-wrap" (click)="deletePost()" *ngIf="offlinePost || (canDelete && isOnline)">
|
<ion-item class="ion-text-wrap" (click)="deletePost()" *ngIf="offlinePost || (canDelete && isOnline)">
|
||||||
<ion-icon name="fas-trash" slot="start"></ion-icon>
|
<ion-icon name="fas-trash" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<h2 *ngIf="!offlinePost">{{ 'addon.mod_forum.delete' | translate }}</h2>
|
<h2 *ngIf="!offlinePost">{{ 'addon.mod_forum.delete' | translate }}</h2>
|
||||||
<h2 *ngIf="offlinePost">{{ 'core.discard' | translate }}</h2>
|
<h2 *ngIf="offlinePost">{{ 'core.discard' | translate }}</h2>
|
||||||
|
@ -18,7 +18,7 @@
|
||||||
</ion-label>
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ion-item class="ion-text-wrap" [href]="url" *ngIf="url" core-link capture="false">
|
<ion-item class="ion-text-wrap" [href]="url" *ngIf="url" core-link capture="false">
|
||||||
<ion-icon name="open" slot="start"></ion-icon>
|
<ion-icon name="fas-external-link-alt" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<h2>{{ 'core.openinbrowser' | translate }}</h2>
|
<h2>{{ 'core.openinbrowser' | translate }}</h2>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
|
|
|
@ -4,9 +4,11 @@
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<div class="addon-mod-forum-post-title" *ngIf="displaySubject">
|
<div class="addon-mod-forum-post-title" *ngIf="displaySubject">
|
||||||
<h2 class="ion-text-wrap">
|
<h2 class="ion-text-wrap">
|
||||||
<ion-icon name="fa-map-pin" *ngIf="discussion && !post.parentid && discussion.pinned">
|
<ion-icon name="fa-map-pin" *ngIf="discussion && !post.parentid && discussion.pinned"
|
||||||
|
[attr.aria-label]="'addon.mod_forum.discussionpinned' | translate">
|
||||||
</ion-icon>
|
</ion-icon>
|
||||||
<ion-icon name="fa-star" class="addon-forum-star"
|
<ion-icon name="fa-star" class="addon-forum-star"
|
||||||
|
[attr.aria-label]="'addon.mod_forum.favourites' | translate"
|
||||||
*ngIf="discussion && !post.parentid && !discussion.pinned && discussion.starred">
|
*ngIf="discussion && !post.parentid && !discussion.pinned && discussion.starred">
|
||||||
</ion-icon>
|
</ion-icon>
|
||||||
<core-format-text
|
<core-format-text
|
||||||
|
@ -16,13 +18,12 @@
|
||||||
</h2>
|
</h2>
|
||||||
<ion-note *ngIf="trackPosts && post.unread"
|
<ion-note *ngIf="trackPosts && post.unread"
|
||||||
class="ion-float-end ion-padding-left ion-text-end" [attr.aria-label]="'addon.mod_forum.unread' | translate">
|
class="ion-float-end ion-padding-left ion-text-end" [attr.aria-label]="'addon.mod_forum.unread' | translate">
|
||||||
<ion-icon name="fa-circle" color="primary">
|
<ion-icon name="fa-circle" color="primary" aria-hidden="true"></ion-icon>
|
||||||
</ion-icon>
|
|
||||||
</ion-note>
|
</ion-note>
|
||||||
<ion-button *ngIf="optionsMenuEnabled"
|
<ion-button *ngIf="optionsMenuEnabled"
|
||||||
fill="clear" color="dark" [attr.aria-label]="('core.displayoptions' | translate)"
|
fill="clear" color="dark" [attr.aria-label]="('core.displayoptions' | translate)"
|
||||||
(click)="showOptionsMenu($event)">
|
(click)="showOptionsMenu($event)">
|
||||||
<ion-icon name="ellipsis-vertical" slot="icon-only">
|
<ion-icon name="ellipsis-vertical" slot="icon-only" aria-hidden="true">
|
||||||
</ion-icon>
|
</ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</div>
|
</div>
|
||||||
|
@ -33,23 +34,24 @@
|
||||||
<h3 *ngIf="post.author && post.author.fullname">{{post.author.fullname}}</h3>
|
<h3 *ngIf="post.author && post.author.fullname">{{post.author.fullname}}</h3>
|
||||||
<p *ngIf="post.author && post.author.groups">
|
<p *ngIf="post.author && post.author.groups">
|
||||||
<ng-container *ngFor="let group of post.author.groups">
|
<ng-container *ngFor="let group of post.author.groups">
|
||||||
<ion-icon name="people"></ion-icon> {{ group.name }}
|
<ion-icon name="fas-users" [attr.aria-label]="'addon.mod_forum.group' | translate">
|
||||||
|
</ion-icon> {{ group.name }}
|
||||||
</ng-container>
|
</ng-container>
|
||||||
</p>
|
</p>
|
||||||
<p *ngIf="post.timecreated">{{post.timecreated * 1000 | coreFormatDate: "strftimerecentfull"}}</p>
|
<p *ngIf="post.timecreated">{{post.timecreated * 1000 | coreFormatDate: "strftimerecentfull"}}</p>
|
||||||
<p *ngIf="!post.timecreated"><ion-icon name="fas-clock"></ion-icon> {{ 'core.notsent' | translate }}</p>
|
<p *ngIf="!post.timecreated">
|
||||||
|
<ion-icon name="fas-clock" aria-hidden="true"></ion-icon> {{ 'core.notsent' | translate }}
|
||||||
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<ng-container *ngIf="!displaySubject">
|
<ng-container *ngIf="!displaySubject">
|
||||||
<ion-note *ngIf="trackPosts && post.unread"
|
<ion-note *ngIf="trackPosts && post.unread"
|
||||||
class="ion-float-end ion-padding-left ion-text-end" [attr.aria-label]="'addon.mod_forum.unread' | translate">
|
class="ion-float-end ion-padding-left ion-text-end" [attr.aria-label]="'addon.mod_forum.unread' | translate">
|
||||||
<ion-icon name="fa-circle" color="primary">
|
<ion-icon name="fa-circle" color="primary" aria-hidden="true"></ion-icon>
|
||||||
</ion-icon>
|
|
||||||
</ion-note>
|
</ion-note>
|
||||||
<ion-button *ngIf="optionsMenuEnabled"
|
<ion-button *ngIf="optionsMenuEnabled"
|
||||||
fill="clear" color="dark" [attr.aria-label]="('core.displayoptions' | translate)"
|
fill="clear" color="dark" [attr.aria-label]="('core.displayoptions' | translate)"
|
||||||
(click)="showOptionsMenu($event)">
|
(click)="showOptionsMenu($event)">
|
||||||
<ion-icon name="ellipsis-vertical" slot="icon-only">
|
<ion-icon name="ellipsis-vertical" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
</ion-icon>
|
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
</div>
|
</div>
|
||||||
|
@ -92,7 +94,7 @@
|
||||||
[attr.aria-controls]="'addon-forum-reply-edit-form-' + uniqueId"
|
[attr.aria-controls]="'addon-forum-reply-edit-form-' + uniqueId"
|
||||||
[attr.aria-expanded]="replyData.replyingTo === post.id"
|
[attr.aria-expanded]="replyData.replyingTo === post.id"
|
||||||
(click)="showReplyForm()">
|
(click)="showReplyForm()">
|
||||||
<ion-icon name="fa-reply" slot="start">
|
<ion-icon name="fa-reply" slot="start" aria-hidden="true">
|
||||||
</ion-icon> {{ 'addon.mod_forum.reply' | translate }}
|
</ion-icon> {{ 'addon.mod_forum.reply' | translate }}
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
|
@ -120,12 +122,11 @@
|
||||||
<ion-checkbox slot="end" [(ngModel)]="replyData.isprivatereply" name="isprivatereply"></ion-checkbox>
|
<ion-checkbox slot="end" [(ngModel)]="replyData.isprivatereply" name="isprivatereply"></ion-checkbox>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ng-container *ngIf="forum.id && forum.maxattachments > 0">
|
<ng-container *ngIf="forum.id && forum.maxattachments > 0">
|
||||||
<ion-item-divider class="core-expandable ion-text-wrap" (click)="toggleAdvanced()">
|
<ion-item-divider class="core-expandable ion-text-wrap" (click)="toggleAdvanced()" [attr.aria-expanded]="advanced"
|
||||||
|
[attr.aria-label]="(advanced ? 'core.hideadvanced' : 'core.showadvanced') |translate">
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<ion-icon *ngIf="!advanced" name="fa-caret-right" slot="start">
|
<ion-icon *ngIf="!advanced" name="fa-caret-right" slot="start" aria-hidden="true"></ion-icon>
|
||||||
</ion-icon>
|
<ion-icon *ngIf="advanced" name="fa-caret-down" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-icon *ngIf="advanced" name="fa-caret-down" slot="start">
|
|
||||||
</ion-icon>
|
|
||||||
{{ 'addon.mod_forum.advanced' | translate }}
|
{{ 'addon.mod_forum.advanced' | translate }}
|
||||||
</ion-label>
|
</ion-label>
|
||||||
</ion-item-divider>
|
</ion-item-divider>
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
<ion-title>{{ 'core.sort' | translate }}</ion-title>
|
<ion-title>{{ 'core.sort' | translate }}</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
<ion-button (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
||||||
<ion-icon name="close" slot="icon-only"></ion-icon>
|
<ion-icon name="fas-times" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
"errorgetforum": "Error getting forum data.",
|
"errorgetforum": "Error getting forum data.",
|
||||||
"errorgetgroups": "Error getting group settings.",
|
"errorgetgroups": "Error getting group settings.",
|
||||||
"errorposttoallgroups": "Could not create new discussion in all groups.",
|
"errorposttoallgroups": "Could not create new discussion in all groups.",
|
||||||
|
"favourites": "Starred",
|
||||||
"favouriteupdated": "Your star option has been updated.",
|
"favouriteupdated": "Your star option has been updated.",
|
||||||
"forumnodiscussionsyet": "There are no discussions yet in this forum.",
|
"forumnodiscussionsyet": "There are no discussions yet in this forum.",
|
||||||
"group": "Group",
|
"group": "Group",
|
||||||
|
|
|
@ -69,7 +69,7 @@
|
||||||
<!-- Discussion replies found to be synchronized -->
|
<!-- Discussion replies found to be synchronized -->
|
||||||
<ion-card class="core-warning-card" *ngIf="postHasOffline || hasOfflineRatings">
|
<ion-card class="core-warning-card" *ngIf="postHasOffline || hasOfflineRatings">
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-icon name="fas-exclamation-triangle" slot="start"></ion-icon>
|
<ion-icon name="fas-exclamation-triangle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>{{ 'core.hasdatatosync' | translate:{$a: discussionStr} }}</ion-label>
|
<ion-label>{{ 'core.hasdatatosync' | translate:{$a: discussionStr} }}</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
@ -77,14 +77,14 @@
|
||||||
<!-- Cut-off date or due date message -->
|
<!-- Cut-off date or due date message -->
|
||||||
<ion-card class="core-info-card" *ngIf="availabilityMessage">
|
<ion-card class="core-info-card" *ngIf="availabilityMessage">
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-icon name="information-circle" slot="start"></ion-icon>
|
<ion-icon name="fas-info-circle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>{{ availabilityMessage }}</ion-label>
|
<ion-label>{{ availabilityMessage }}</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
|
||||||
<ion-card class="core-info-card" *ngIf="discussion && discussion.locked">
|
<ion-card class="core-info-card" *ngIf="discussion && discussion.locked">
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-icon name="fa-lock" slot="start"></ion-icon>
|
<ion-icon name="fa-lock" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>{{ 'addon.mod_forum.discussionlocked' | translate }}</ion-label>
|
<ion-label>{{ 'addon.mod_forum.discussionlocked' | translate }}</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
|
|
@ -31,11 +31,10 @@
|
||||||
(contentChanged)="onMessageChange($event)">
|
(contentChanged)="onMessageChange($event)">
|
||||||
</core-rich-text-editor>
|
</core-rich-text-editor>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ion-item-divider class="ion-text-wrap core-expandable" (click)="toggleAdvanced()">
|
<ion-item-divider class="ion-text-wrap core-expandable" (click)="toggleAdvanced()" [attr.aria-expanded]="advanced"
|
||||||
<ion-icon *ngIf="!advanced" name="fa-caret-right" slot="start">
|
[attr.aria-label]="(advanced ? 'core.hideadvanced' : 'core.showadvanced') |translate">
|
||||||
</ion-icon>
|
<ion-icon *ngIf="!advanced" name="fa-caret-right" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-icon *ngIf="advanced" name="fa-caret-down" slot="start">
|
<ion-icon *ngIf="advanced" name="fa-caret-down" slot="start" aria-hidden="true"></ion-icon>
|
||||||
</ion-icon>
|
|
||||||
<ion-label>{{ 'addon.mod_forum.advanced' | translate }}</ion-label>
|
<ion-label>{{ 'addon.mod_forum.advanced' | translate }}</ion-label>
|
||||||
</ion-item-divider>
|
</ion-item-divider>
|
||||||
<ng-container *ngIf="advanced">
|
<ng-container *ngIf="advanced">
|
||||||
|
|
|
@ -2,11 +2,11 @@
|
||||||
<core-navbar-buttons slot="end">
|
<core-navbar-buttons slot="end">
|
||||||
<ion-button *ngIf="glossary && glossary.browsemodes && glossary.browsemodes.length > 1" (click)="openModePicker($event)"
|
<ion-button *ngIf="glossary && glossary.browsemodes && glossary.browsemodes.length > 1" (click)="openModePicker($event)"
|
||||||
[attr.aria-label]="'addon.mod_glossary.browsemode' | translate">
|
[attr.aria-label]="'addon.mod_glossary.browsemode' | translate">
|
||||||
<ion-icon name="fas-sort"></ion-icon>
|
<ion-icon name="fas-sort" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
|
|
||||||
<ion-button *ngIf="glossary" (click)="toggleSearch()" [attr.aria-label]="'addon.mod_glossary.bysearch' | translate">
|
<ion-button *ngIf="glossary" (click)="toggleSearch()" [attr.aria-label]="'addon.mod_glossary.bysearch' | translate">
|
||||||
<ion-icon name="fas-search"></ion-icon>
|
<ion-icon name="fas-search" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
|
|
||||||
<core-context-menu>
|
<core-context-menu>
|
||||||
|
@ -57,7 +57,7 @@
|
||||||
<!-- Has offline data to be synchronized -->
|
<!-- Has offline data to be synchronized -->
|
||||||
<ion-card class="core-warning-card" *ngIf="hasOffline || hasOfflineRatings">
|
<ion-card class="core-warning-card" *ngIf="hasOffline || hasOfflineRatings">
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-icon name="fas-exclamation-triangle" slot="start"></ion-icon>
|
<ion-icon name="fas-exclamation-triangle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>{{ 'core.hasdatatosync' | translate:{$a: moduleName} }}</ion-label>
|
<ion-label>{{ 'core.hasdatatosync' | translate:{$a: moduleName} }}</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
@ -101,7 +101,7 @@
|
||||||
|
|
||||||
<ion-fab slot="fixed" core-fab vertical="bottom" horizontal="end" *ngIf="canAdd">
|
<ion-fab slot="fixed" core-fab vertical="bottom" horizontal="end" *ngIf="canAdd">
|
||||||
<ion-fab-button (click)="openNewEntry()" [attr.aria-label]="'addon.mod_glossary.addentry' | translate">
|
<ion-fab-button (click)="openNewEntry()" [attr.aria-label]="'addon.mod_glossary.addentry' | translate">
|
||||||
<ion-icon name="fas-plus"></ion-icon>
|
<ion-icon name="fas-plus" aria-hidden="true"></ion-icon>
|
||||||
</ion-fab-button>
|
</ion-fab-button>
|
||||||
</ion-fab>
|
</ion-fab>
|
||||||
</core-split-view>
|
</core-split-view>
|
||||||
|
|
|
@ -39,7 +39,7 @@
|
||||||
<!-- Offline data stored. -->
|
<!-- Offline data stored. -->
|
||||||
<ion-card class="core-warning-card" *ngIf="hasOffline">
|
<ion-card class="core-warning-card" *ngIf="hasOffline">
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-icon name="fas-exclamation-triangle" slot="start"></ion-icon>
|
<ion-icon name="fas-exclamation-triangle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>{{ 'core.hasdatatosync' | translate: {$a: moduleName} }}</ion-label>
|
<ion-label>{{ 'core.hasdatatosync' | translate: {$a: moduleName} }}</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
@ -47,7 +47,7 @@
|
||||||
<!-- Offline disabled. -->
|
<!-- Offline disabled. -->
|
||||||
<ion-card class="core-warning-card" *ngIf="!siteCanDownload && playing">
|
<ion-card class="core-warning-card" *ngIf="!siteCanDownload && playing">
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-icon name="fas-exclamation-triangle" slot="start"></ion-icon>
|
<ion-icon name="fas-exclamation-triangle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>
|
<ion-label>
|
||||||
{{ 'core.h5p.offlinedisabled' | translate }} {{ 'addon.mod_h5pactivity.offlinedisabledwarning' | translate }}
|
{{ 'core.h5p.offlinedisabled' | translate }} {{ 'addon.mod_h5pactivity.offlinedisabledwarning' | translate }}
|
||||||
</ion-label>
|
</ion-label>
|
||||||
|
@ -57,7 +57,7 @@
|
||||||
<!-- Preview mode. -->
|
<!-- Preview mode. -->
|
||||||
<ion-card class="core-warning-card" *ngIf="accessInfo && !trackComponent">
|
<ion-card class="core-warning-card" *ngIf="accessInfo && !trackComponent">
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-icon name="fas-exclamation-triangle" slot="start"></ion-icon>
|
<ion-icon name="fas-exclamation-triangle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>
|
<ion-label>
|
||||||
{{ 'addon.mod_h5pactivity.previewmode' | translate }}
|
{{ 'addon.mod_h5pactivity.previewmode' | translate }}
|
||||||
</ion-label>
|
</ion-label>
|
||||||
|
|
|
@ -63,11 +63,11 @@
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<h2>{{ 'addon.mod_h5pactivity.outcome' | translate }}</h2>
|
<h2>{{ 'addon.mod_h5pactivity.outcome' | translate }}</h2>
|
||||||
<p *ngIf="attempt.success !== null && attempt.success" >
|
<p *ngIf="attempt.success !== null && attempt.success" >
|
||||||
<ion-icon name="fa-check-circle"></ion-icon>
|
<ion-icon name="fa-check-circle" aria-hidden="true"></ion-icon>
|
||||||
{{ 'addon.mod_h5pactivity.attempt_success_pass' | translate }}
|
{{ 'addon.mod_h5pactivity.attempt_success_pass' | translate }}
|
||||||
</p>
|
</p>
|
||||||
<p *ngIf="attempt.success !== null && !attempt.success" >
|
<p *ngIf="attempt.success !== null && !attempt.success" >
|
||||||
<ion-icon name="far-circle"></ion-icon>
|
<ion-icon name="far-circle" aria-hidden="true"></ion-icon>
|
||||||
{{ 'addon.mod_h5pactivity.attempt_success_fail' | translate }}
|
{{ 'addon.mod_h5pactivity.attempt_success_fail' | translate }}
|
||||||
</p>
|
</p>
|
||||||
<p *ngIf="attempt.success === null" >
|
<p *ngIf="attempt.success === null" >
|
||||||
|
@ -152,7 +152,7 @@
|
||||||
|
|
||||||
<!-- Result doesn't support tracking. -->
|
<!-- Result doesn't support tracking. -->
|
||||||
<ion-item class="ion-text-wrap core-warning-item" *ngIf="!result.track" lines="none">
|
<ion-item class="ion-text-wrap core-warning-item" *ngIf="!result.track" lines="none">
|
||||||
<ion-icon slot="start" name="fas-exclamation-triangle" color="warning"></ion-icon>
|
<ion-icon slot="start" name="fas-exclamation-triangle" color="warning" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>
|
<ion-label>
|
||||||
{{ 'addon.mod_h5pactivity.no_compatible_track' | translate:{$a: result.interactiontype} }}
|
{{ 'addon.mod_h5pactivity.no_compatible_track' | translate:{$a: result.interactiontype} }}
|
||||||
</ion-label>
|
</ion-label>
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<!-- Buttons to add to the header. -->
|
<!-- Buttons to add to the header. -->
|
||||||
<core-navbar-buttons slot="end">
|
<core-navbar-buttons slot="end">
|
||||||
<ion-button (click)="showToc()">
|
<ion-button (click)="showToc()" aria-haspopup="true" [attr.aria-label]="'addon.mod_imscp.toc' | translate">
|
||||||
<ion-icon name="fas-bookmark" slot="icon-only"></ion-icon>
|
<ion-icon name="fas-bookmark" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
<core-context-menu>
|
<core-context-menu>
|
||||||
<core-context-menu-item *ngIf="externalUrl" [priority]="900" [content]="'core.openinbrowser' | translate"
|
<core-context-menu-item *ngIf="externalUrl" [priority]="900" [content]="'core.openinbrowser' | translate"
|
||||||
|
@ -29,8 +29,10 @@
|
||||||
<core-loading [hideUntil]="loaded" class="core-loading-center safe-area-page">
|
<core-loading [hideUntil]="loaded" class="core-loading-center safe-area-page">
|
||||||
|
|
||||||
<ion-card class="core-warning-card" *ngIf="warning">
|
<ion-card class="core-warning-card" *ngIf="warning">
|
||||||
<ion-icon name="fas-exclamation-triangle" slot="start"></ion-icon>
|
<ion-item>
|
||||||
<span [innerHTML]="warning"></span>
|
<ion-icon name="fas-exclamation-triangle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
|
<ion-label><span [innerHTML]="warning"></span></ion-label>
|
||||||
|
</ion-item>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
|
||||||
<div class="addon-mod-imscp-container">
|
<div class="addon-mod-imscp-container">
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
<ion-title>{{ 'addon.mod_imscp.toc' | translate }}</ion-title>
|
<ion-title>{{ 'addon.mod_imscp.toc' | translate }}</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
<ion-button (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
||||||
<ion-icon name="fas-times" slot="icon-only"></ion-icon>
|
<ion-icon name="fas-times" slot="icon-only" aria-hidden=true></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
|
|
|
@ -38,7 +38,7 @@
|
||||||
<!-- Prevent access messages. Only show the first one. -->
|
<!-- Prevent access messages. Only show the first one. -->
|
||||||
<ion-card class="core-info-card" *ngIf="lesson && preventReasons.length">
|
<ion-card class="core-info-card" *ngIf="lesson && preventReasons.length">
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-icon name="fas-info-circle" slot="start"></ion-icon>
|
<ion-icon name="fas-info-circle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label [innerHTML]="preventReasons[0].message"></ion-label>
|
<ion-label [innerHTML]="preventReasons[0].message"></ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
@ -46,7 +46,7 @@
|
||||||
<!-- Lesson has data to be synchronized -->
|
<!-- Lesson has data to be synchronized -->
|
||||||
<ion-card class="core-warning-card" *ngIf="hasOffline">
|
<ion-card class="core-warning-card" *ngIf="hasOffline">
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-icon name="fas-exclamation-triangle" slot="start"></ion-icon>
|
<ion-icon name="fas-exclamation-triangle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>{{ 'core.hasdatatosync' | translate: {$a: moduleName} }}</ion-label>
|
<ion-label>{{ 'core.hasdatatosync' | translate: {$a: moduleName} }}</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
@ -64,7 +64,7 @@
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ion-button expand="block" type="submit">
|
<ion-button expand="block" type="submit">
|
||||||
{{ 'addon.mod_lesson.continue' | translate }}
|
{{ 'addon.mod_lesson.continue' | translate }}
|
||||||
<ion-icon slot="end" name="fas-chevron-right"></ion-icon>
|
<ion-icon slot="end" name="fas-chevron-right" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
<!-- Remove this once Ionic fixes this bug: https://github.com/ionic-team/ionic-framework/issues/19368 -->
|
<!-- Remove this once Ionic fixes this bug: https://github.com/ionic-team/ionic-framework/issues/19368 -->
|
||||||
<input type="submit" class="core-submit-hidden-enter" />
|
<input type="submit" class="core-submit-hidden-enter" />
|
||||||
|
@ -114,7 +114,7 @@
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ion-button class="ion-text-wrap ion-margin" expand="block" (click)="start(false)">
|
<ion-button class="ion-text-wrap ion-margin" expand="block" (click)="start(false)">
|
||||||
{{ 'addon.mod_lesson.continue' | translate }}
|
{{ 'addon.mod_lesson.continue' | translate }}
|
||||||
<ion-icon name="fas-chevron-right" slot="end"></ion-icon>
|
<ion-icon name="fas-chevron-right" slot="end" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
|
@ -129,19 +129,19 @@
|
||||||
<ion-button class="ion-text-wrap ion-margin" expand="block" *ngIf="!canManage"
|
<ion-button class="ion-text-wrap ion-margin" expand="block" *ngIf="!canManage"
|
||||||
(click)="start(false)">
|
(click)="start(false)">
|
||||||
{{ 'core.start' | translate }}
|
{{ 'core.start' | translate }}
|
||||||
<ion-icon name="fas-chevron-right" slot="end"></ion-icon>
|
<ion-icon name="fas-chevron-right" slot="end" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
<ion-button class="ion-text-wrap ion-margin" expand="block" *ngIf="canManage"
|
<ion-button class="ion-text-wrap ion-margin" expand="block" *ngIf="canManage"
|
||||||
(click)="start(false)">
|
(click)="start(false)">
|
||||||
{{ 'addon.mod_lesson.preview' | translate }}
|
{{ 'addon.mod_lesson.preview' | translate }}
|
||||||
<ion-icon name="fas-search" slot="end"></ion-icon>
|
<ion-icon name="fas-search" slot="end" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
<ion-button class="ion-text-wrap" *ngIf="finishedOffline" expand="block" (click)="start(true)">
|
<ion-button class="ion-text-wrap" *ngIf="finishedOffline" expand="block" (click)="start(true)">
|
||||||
<!-- There's an attempt finished in offline. Let the user continue, showing the end of lesson. -->
|
<!-- There's an attempt finished in offline. Let the user continue, showing the end of lesson. -->
|
||||||
{{ 'addon.mod_lesson.continue' | translate }}
|
{{ 'addon.mod_lesson.continue' | translate }}
|
||||||
<ion-icon name="fas-chevron-right" slot="end"></ion-icon>
|
<ion-icon name="fas-chevron-right" slot="end" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
</ion-list>
|
</ion-list>
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
<ion-button (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
||||||
<ion-icon slot="icon-only" name="fas-times"></ion-icon>
|
<ion-icon slot="icon-only" name="fas-times" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
<ion-button (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
||||||
<ion-icon slot="icon-only" name="fas-times"></ion-icon>
|
<ion-icon slot="icon-only" name="fas-times" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
|
@ -21,7 +21,7 @@
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ion-button expand="block" type="submit">
|
<ion-button expand="block" type="submit">
|
||||||
{{ 'addon.mod_lesson.continue' | translate }}
|
{{ 'addon.mod_lesson.continue' | translate }}
|
||||||
<ion-icon slot="end" name="fas-chevron-right"></ion-icon>
|
<ion-icon slot="end" name="fas-chevron-right" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
<!-- Remove this once Ionic fixes this bug: https://github.com/ionic-team/ionic-framework/issues/19368 -->
|
<!-- Remove this once Ionic fixes this bug: https://github.com/ionic-team/ionic-framework/issues/19368 -->
|
||||||
<input type="submit" class="core-submit-hidden-enter" />
|
<input type="submit" class="core-submit-hidden-enter" />
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button *ngIf="displayMenu || mediaFile" [attr.aria-label]="'addon.mod_lesson.lessonmenu' | translate"
|
<ion-button *ngIf="displayMenu || mediaFile" [attr.aria-label]="'addon.mod_lesson.lessonmenu' | translate"
|
||||||
(click)="showMenu()">
|
(click)="showMenu()">
|
||||||
<ion-icon name="bookmark" slot="icon-only"></ion-icon>
|
<ion-icon name="fas-bookmark" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
|
@ -21,7 +21,7 @@
|
||||||
<!-- Info messages. Only show the first one. -->
|
<!-- Info messages. Only show the first one. -->
|
||||||
<ion-card class="core-info-card" *ngIf="lesson && messages?.length">
|
<ion-card class="core-info-card" *ngIf="lesson && messages?.length">
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-icon name="fas-info-circle" slot="start"></ion-icon>
|
<ion-icon name="fas-info-circle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>{{ messages[0].message }}</ion-label>
|
<ion-label>{{ messages[0].message }}</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
@ -172,7 +172,7 @@
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<div class="core-info-card" *ngIf="lesson?.progressbar && canManage">
|
<div class="core-info-card" *ngIf="lesson?.progressbar && canManage">
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-icon name="fas-info-circle" slot="start"></ion-icon>
|
<ion-icon name="fas-info-circle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>{{ 'addon.mod_lesson.progressbarteacherwarning2' | translate }}</ion-label>
|
<ion-label>{{ 'addon.mod_lesson.progressbarteacherwarning2' | translate }}</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</div>
|
</div>
|
||||||
|
@ -182,7 +182,7 @@
|
||||||
<ion-card *ngIf="eolData && !processData">
|
<ion-card *ngIf="eolData && !processData">
|
||||||
<div class="core-warning-card" *ngIf="eolData.offline?.value">
|
<div class="core-warning-card" *ngIf="eolData.offline?.value">
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-icon name="fas-exclamation-triangle" slot="start"></ion-icon>
|
<ion-icon name="fas-exclamation-triangle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>{{ 'addon.mod_lesson.finishretakeoffline' | translate }}</ion-label>
|
<ion-label>{{ 'addon.mod_lesson.finishretakeoffline' | translate }}</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
|
|
||||||
<div class="ion-padding">
|
<div class="ion-padding">
|
||||||
<ion-button expand="block" (click)="launch()">
|
<ion-button expand="block" (click)="launch()">
|
||||||
<ion-icon name="fas-external-link-alt" slot="start"></ion-icon>
|
<ion-icon name="fas-external-link-alt" slot="start" aria-hidden="true"></ion-icon>
|
||||||
{{ 'addon.mod_lti.launchactivity' | translate }}
|
{{ 'addon.mod_lti.launchactivity' | translate }}
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -30,8 +30,10 @@
|
||||||
</core-course-module-description>
|
</core-course-module-description>
|
||||||
|
|
||||||
<ion-card class="core-warning-card" *ngIf="warning">
|
<ion-card class="core-warning-card" *ngIf="warning">
|
||||||
<ion-icon name="fas-exclamation-triangle" slot="start"></ion-icon>
|
<ion-item>
|
||||||
<span [innerHTML]="warning"></span>
|
<ion-icon name="fas-exclamation-triangle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
|
<ion-label><span [innerHTML]="warning"></span></ion-label>
|
||||||
|
</ion-item>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
|
||||||
<div class="ion-padding">
|
<div class="ion-padding">
|
||||||
|
|
|
@ -164,7 +164,7 @@
|
||||||
<!-- Quiz has data to be synchronized -->
|
<!-- Quiz has data to be synchronized -->
|
||||||
<ion-card class="core-warning-card" *ngIf="buttonText && hasOffline && !showStatusSpinner">
|
<ion-card class="core-warning-card" *ngIf="buttonText && hasOffline && !showStatusSpinner">
|
||||||
<ion-item class="ion-text-wrap">
|
<ion-item class="ion-text-wrap">
|
||||||
<ion-icon name="fas-exclamation-triangle" slot="start"></ion-icon>
|
<ion-icon name="fas-exclamation-triangle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>{{ 'core.hasdatatosync' | translate: {$a: moduleName} }}</ion-label>
|
<ion-label>{{ 'core.hasdatatosync' | translate: {$a: moduleName} }}</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
@ -187,7 +187,7 @@
|
||||||
<ion-button class="ion-margin" *ngIf="!buttonText && ((!hasSupportedQuestions && unsupportedQuestions.length) ||
|
<ion-button class="ion-margin" *ngIf="!buttonText && ((!hasSupportedQuestions && unsupportedQuestions.length) ||
|
||||||
unsupportedRules.length || behaviourSupported === false)" expand="block" [href]="externalUrl" core-link>
|
unsupportedRules.length || behaviourSupported === false)" expand="block" [href]="externalUrl" core-link>
|
||||||
{{ 'core.openinbrowser' | translate }}
|
{{ 'core.openinbrowser' | translate }}
|
||||||
<ion-icon name="fas-external-link-alt" slot="end"></ion-icon>
|
<ion-icon name="fas-external-link-alt" slot="end" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
|
|
||||||
<!-- Spinner shown while downloading or calculating. -->
|
<!-- Spinner shown while downloading or calculating. -->
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
<ion-button (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
||||||
<ion-icon slot="icon-only" name="fas-times"></ion-icon>
|
<ion-icon slot="icon-only" name="fas-times" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
|
@ -34,7 +34,7 @@
|
||||||
<span *ngIf="!question.number">{{ 'core.question.information' | translate }}</span>
|
<span *ngIf="!question.number">{{ 'core.question.information' | translate }}</span>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
|
|
||||||
<ion-icon *ngIf="!question.number" name="fas-info-circle" slot="end"></ion-icon>
|
<ion-icon *ngIf="!question.number" name="fas-info-circle" slot="end" aria-hidden="true"></ion-icon>
|
||||||
<ion-icon *ngIf="question.stateClass == 'core-question-requiresgrading'" name="fas-question-circle"
|
<ion-icon *ngIf="question.stateClass == 'core-question-requiresgrading'" name="fas-question-circle"
|
||||||
[attr.aria-label]="question.status" slot="end">
|
[attr.aria-label]="question.status" slot="end">
|
||||||
</ion-icon>
|
</ion-icon>
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
<ion-button (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
||||||
<ion-icon slot="icon-only" name="fas-times"></ion-icon>
|
<ion-icon slot="icon-only" name="fas-times" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
|
|
|
@ -52,7 +52,7 @@
|
||||||
</ion-label>
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ion-button *ngIf="showReviewColumn && attempt.finished" class="ion-margin" expand="block" (click)="reviewAttempt()">
|
<ion-button *ngIf="showReviewColumn && attempt.finished" class="ion-margin" expand="block" (click)="reviewAttempt()">
|
||||||
<ion-icon name="fas-search" slot="start"></ion-icon>
|
<ion-icon name="fas-search" slot="start" aria-hidden="true"></ion-icon>
|
||||||
{{ 'addon.mod_quiz.review' | translate }}
|
{{ 'addon.mod_quiz.review' | translate }}
|
||||||
</ion-button>
|
</ion-button>
|
||||||
<ion-item class="ion-text-wrap core-danger-item" *ngIf="!showReviewColumn">
|
<ion-item class="ion-text-wrap core-danger-item" *ngIf="!showReviewColumn">
|
||||||
|
|
|
@ -11,12 +11,12 @@
|
||||||
|
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button id="addon-mod_quiz-connection-error-button" [hidden]="!autoSaveError" (click)="showConnectionError($event)"
|
<ion-button id="addon-mod_quiz-connection-error-button" [hidden]="!autoSaveError" (click)="showConnectionError($event)"
|
||||||
[attr.aria-label]="'core.error' | translate">
|
[attr.aria-label]="'addon.mod_quiz.connectionerror' | translate" aria-haspopup="true">
|
||||||
<ion-icon name="fas-exclamation-circle" slot="icon-only"></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"></ion-icon>
|
<ion-icon name="fas-bookmark" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
|
@ -30,11 +30,11 @@
|
||||||
</core-timer>
|
</core-timer>
|
||||||
</ion-title>
|
</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button *ngIf="previousPage >= 0" (click)="changePage(previousPage)" [title]="'core.previous' | translate">
|
<ion-button *ngIf="previousPage >= 0" (click)="changePage(previousPage)" [attr.aria-label]="'core.previous' | translate">
|
||||||
<ion-icon name="fas-chevron-left" slot="icon-only"></ion-icon>
|
<ion-icon name="fas-chevron-left" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
<ion-button *ngIf="nextPage >= -1" (click)="changePage(nextPage)" [title]="'core.next' | translate">
|
<ion-button *ngIf="nextPage >= -1" (click)="changePage(nextPage)" [attr.aria-label]="'core.next' | translate">
|
||||||
<ion-icon name="fas-chevron-right" slot="icon-only"></ion-icon>
|
<ion-icon name="fas-chevron-right" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
|
@ -43,11 +43,12 @@
|
||||||
<!-- Navigation arrows if there's no timer. -->
|
<!-- Navigation arrows if there's no timer. -->
|
||||||
<ion-toolbar *ngIf="!endTime && questions.length && !quizAborted && !showSummary" color="light">
|
<ion-toolbar *ngIf="!endTime && questions.length && !quizAborted && !showSummary" color="light">
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button *ngIf="previousPage >= 0" (click)="changePage(previousPage)" [title]="'core.previous' | translate">
|
<ion-button *ngIf="previousPage >= 0" (click)="changePage(previousPage)"
|
||||||
<ion-icon name="fas-chevron-left" slot="icon-only"></ion-icon>
|
[attr.aria-label]="'core.previous' | translate">
|
||||||
|
<ion-icon name="fas-chevron-left" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
<ion-button *ngIf="nextPage >= -1" (click)="changePage(nextPage)" [title]="'core.next' | translate">
|
<ion-button *ngIf="nextPage >= -1" (click)="changePage(nextPage)" [attr.aria-label]="'core.next' | translate">
|
||||||
<ion-icon name="fas-chevron-right" slot="icon-only"></ion-icon>
|
<ion-icon name="fas-chevron-right" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
|
@ -92,14 +93,14 @@
|
||||||
<ion-row>
|
<ion-row>
|
||||||
<ion-col *ngIf="previousPage >= 0" >
|
<ion-col *ngIf="previousPage >= 0" >
|
||||||
<ion-button expand="block" color="light" (click)="changePage(previousPage)">
|
<ion-button expand="block" color="light" (click)="changePage(previousPage)">
|
||||||
<ion-icon name="fas-chevron-left" slot="start"></ion-icon>
|
<ion-icon name="fas-chevron-left" slot="start" aria-hidden="true"></ion-icon>
|
||||||
{{ 'core.previous' | translate }}
|
{{ 'core.previous' | translate }}
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-col>
|
</ion-col>
|
||||||
<ion-col *ngIf="nextPage >= -1">
|
<ion-col *ngIf="nextPage >= -1">
|
||||||
<ion-button expand="block" (click)="changePage(nextPage)">
|
<ion-button expand="block" (click)="changePage(nextPage)">
|
||||||
{{ 'core.next' | translate }}
|
{{ 'core.next' | translate }}
|
||||||
<ion-icon name="fas-chevron-right" slot="end"></ion-icon>
|
<ion-icon name="fas-chevron-right" slot="end" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-col>
|
</ion-col>
|
||||||
</ion-row>
|
</ion-row>
|
||||||
|
@ -165,7 +166,7 @@
|
||||||
|
|
||||||
<ion-button *ngIf="preventSubmitMessages.length" expand="block" [href]="moduleUrl" core-link>
|
<ion-button *ngIf="preventSubmitMessages.length" expand="block" [href]="moduleUrl" core-link>
|
||||||
{{ 'core.openinbrowser' | translate }}
|
{{ 'core.openinbrowser' | translate }}
|
||||||
<ion-icon name="fas-external-link-alt" slot="end"></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. -->
|
||||||
|
@ -182,7 +183,7 @@
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ion-button expand="block" class="ion-margin" [href]="moduleUrl" core-link>
|
<ion-button expand="block" class="ion-margin" [href]="moduleUrl" core-link>
|
||||||
{{ 'core.openinbrowser' | translate }}
|
{{ 'core.openinbrowser' | translate }}
|
||||||
<ion-icon name="fas-external-link-alt" slot="end"></ion-icon>
|
<ion-icon name="fas-external-link-alt" slot="end" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
</core-loading>
|
</core-loading>
|
||||||
|
|
|
@ -7,8 +7,8 @@
|
||||||
|
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<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()" aria-haspopup="true">
|
||||||
<ion-icon name="fas-bookmark" slot="icon-only"></ion-icon>
|
<ion-icon name="fas-bookmark" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
|
@ -124,12 +124,13 @@
|
||||||
<ion-col class="ion-text-start">
|
<ion-col class="ion-text-start">
|
||||||
<ion-button color="light" *ngIf="previousPage >= 0" (click)="changePage(previousPage)"
|
<ion-button color="light" *ngIf="previousPage >= 0" (click)="changePage(previousPage)"
|
||||||
[title]="'core.previous' | translate">
|
[title]="'core.previous' | translate">
|
||||||
<ion-icon name="fas-chevron-left" slot="icon-only"></ion-icon>
|
<ion-icon name="fas-chevron-left" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
</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)" [title]="'core.next' | translate">
|
<ion-button color="light" *ngIf="nextPage >= -1" (click)="changePage(nextPage)"
|
||||||
<ion-icon name="fas-chevron-right" slot="icon-only"></ion-icon>
|
[attr.aria-label]="'core.next' | translate">
|
||||||
|
<ion-icon name="fas-chevron-right" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-col>
|
</ion-col>
|
||||||
</ion-row>
|
</ion-row>
|
||||||
|
|
|
@ -27,7 +27,7 @@
|
||||||
|
|
||||||
<ion-card class="core-warning-card" *ngIf="warning">
|
<ion-card class="core-warning-card" *ngIf="warning">
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-icon name="fas-exclamation-triangle" slot="start"></ion-icon>
|
<ion-icon name="fas-exclamation-triangle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label><span [innerHTML]="warning"></span></ion-label>
|
<ion-label><span [innerHTML]="warning"></span></ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
@ -42,7 +42,7 @@
|
||||||
|
|
||||||
<div class="ion-padding" *ngIf="mode == 'external'">
|
<div class="ion-padding" *ngIf="mode == 'external'">
|
||||||
<ion-button expand="block" (click)="open()">
|
<ion-button expand="block" (click)="open()">
|
||||||
<ion-icon name="far-file" slot="start"></ion-icon>
|
<ion-icon name="far-file" slot="start" aria-hidden="true"></ion-icon>
|
||||||
{{ 'addon.mod_resource.openthefile' | translate }}
|
{{ 'addon.mod_resource.openthefile' | translate }}
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -35,7 +35,7 @@
|
||||||
<!-- Warning message. -->
|
<!-- Warning message. -->
|
||||||
<ion-card class="core-info-card" *ngIf="scorm && scorm.warningMessage">
|
<ion-card class="core-info-card" *ngIf="scorm && scorm.warningMessage">
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-icon name="fas-info-circle" slot="start"></ion-icon>
|
<ion-icon name="fas-info-circle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>{{ scorm.warningMessage }}</ion-label>
|
<ion-label>{{ scorm.warningMessage }}</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
@ -115,7 +115,7 @@
|
||||||
<!-- Synchronization warning. -->
|
<!-- Synchronization warning. -->
|
||||||
<ion-card class="core-warning-card" *ngIf="!errorMessage && hasOffline">
|
<ion-card class="core-warning-card" *ngIf="!errorMessage && hasOffline">
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-icon name="fas-exclamation-triangle" slot="start"></ion-icon>
|
<ion-icon name="fas-exclamation-triangle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>{{ 'core.hasdatatosync' | translate: {$a: moduleName} }}</ion-label>
|
<ion-label>{{ 'core.hasdatatosync' | translate: {$a: moduleName} }}</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
@ -182,7 +182,7 @@
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ion-button class="ion-margin ion-text-wrap" expand="block" [href]="externalUrl" core-link>
|
<ion-button class="ion-margin ion-text-wrap" expand="block" [href]="externalUrl" core-link>
|
||||||
{{ 'core.openinbrowser' | translate }}
|
{{ 'core.openinbrowser' | translate }}
|
||||||
<ion-icon name="fas-external-link-alt" slot="end"></ion-icon>
|
<ion-icon name="fas-external-link-alt" slot="end" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
|
||||||
|
@ -219,13 +219,13 @@
|
||||||
<ion-col *ngIf="!scorm.hidebrowse">
|
<ion-col *ngIf="!scorm.hidebrowse">
|
||||||
<ion-button expand="block" fill="outline" (click)="open($event, true)" class="ion-text-wrap">
|
<ion-button expand="block" fill="outline" (click)="open($event, true)" class="ion-text-wrap">
|
||||||
{{ 'addon.mod_scorm.browse' | translate }}
|
{{ 'addon.mod_scorm.browse' | translate }}
|
||||||
<ion-icon name="fas-search" slot="end"></ion-icon>
|
<ion-icon name="fas-search" slot="end" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-col>
|
</ion-col>
|
||||||
<ion-col>
|
<ion-col>
|
||||||
<ion-button expand="block" (click)="open($event)" class="ion-text-wrap">
|
<ion-button expand="block" (click)="open($event)" class="ion-text-wrap">
|
||||||
{{ 'addon.mod_scorm.enter' | translate }}
|
{{ 'addon.mod_scorm.enter' | translate }}
|
||||||
<ion-icon name="fas-arrow-right" slot="end"></ion-icon>
|
<ion-icon name="fas-arrow-right" slot="end" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-col>
|
</ion-col>
|
||||||
</ion-row>
|
</ion-row>
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
<ion-title>{{ 'addon.mod_scorm.toc' | translate }}</ion-title>
|
<ion-title>{{ 'addon.mod_scorm.toc' | translate }}</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
<ion-button (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
||||||
<ion-icon slot="icon-only" name="fas-times"></ion-icon>
|
<ion-icon slot="icon-only" name="fas-times" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button *ngIf="showToc && !loadingToc && toc.length" (click)="openToc()"
|
<ion-button *ngIf="showToc && !loadingToc && toc.length" (click)="openToc()"
|
||||||
[attr.aria-label]="'addon.mod_scorm.toc' | translate" aria-haspopup="true">
|
[attr.aria-label]="'addon.mod_scorm.toc' | translate" aria-haspopup="true">
|
||||||
<ion-icon name="fas-bookmark" slot="icon-only"></ion-icon>
|
<ion-icon name="fas-bookmark" slot="icon-only" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
<ion-spinner *ngIf="showToc && loadingToc"></ion-spinner>
|
<ion-spinner *ngIf="showToc && loadingToc"></ion-spinner>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
|
|
|
@ -38,7 +38,7 @@
|
||||||
<ion-card class="ion-padding" *ngIf="survey && survey.surveydone">
|
<ion-card class="ion-padding" *ngIf="survey && survey.surveydone">
|
||||||
<p class="ion-padding">{{ 'addon.mod_survey.surveycompletednograph' | translate }}</p>
|
<p class="ion-padding">{{ 'addon.mod_survey.surveycompletednograph' | translate }}</p>
|
||||||
<ion-button expand="block" [href]="externalUrl" core-link>
|
<ion-button expand="block" [href]="externalUrl" core-link>
|
||||||
<ion-icon name="fas-external-link-alt" slot="start"></ion-icon>
|
<ion-icon name="fas-external-link-alt" slot="start" aria-hidden="true"></ion-icon>
|
||||||
{{ 'addon.mod_survey.results' | translate }}
|
{{ 'addon.mod_survey.results' | translate }}
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
@ -46,7 +46,7 @@
|
||||||
<!-- Survey done in offline but not synchronized -->
|
<!-- Survey done in offline but not synchronized -->
|
||||||
<ion-card class="core-warning-card" *ngIf="hasOffline">
|
<ion-card class="core-warning-card" *ngIf="hasOffline">
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-icon name="fas-exclamation-triangle" slot="start"></ion-icon>
|
<ion-icon name="fas-exclamation-triangle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>{{ 'core.hasdatatosync' | translate: {$a: moduleName} }}</ion-label>
|
<ion-label>{{ 'core.hasdatatosync' | translate: {$a: moduleName} }}</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
|
|
@ -44,7 +44,7 @@
|
||||||
<ion-item class="ion-text-wrap">
|
<ion-item class="ion-text-wrap">
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<ion-button expand="block" (click)="go()">
|
<ion-button expand="block" (click)="go()">
|
||||||
<ion-icon name="link" slot="start"></ion-icon>
|
<ion-icon name="fas-link" slot="start" aria-hidden="true"></ion-icon>
|
||||||
{{ 'addon.mod_url.accessurl' | translate }}
|
{{ 'addon.mod_url.accessurl' | translate }}
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
|
|
|
@ -2,14 +2,14 @@
|
||||||
<core-navbar-buttons slot="end">
|
<core-navbar-buttons slot="end">
|
||||||
<!-- Select subwiki. -->
|
<!-- Select subwiki. -->
|
||||||
<ion-button *ngIf="subwikiData.count > 1" (click)="showSubwikiPicker($event)"
|
<ion-button *ngIf="subwikiData.count > 1" (click)="showSubwikiPicker($event)"
|
||||||
[attr.aria-label]="'addon.mod_wiki.subwiki' | translate">
|
[attr.aria-label]="'addon.mod_wiki.subwiki' | translate" aria-haspopup="true">
|
||||||
<ion-icon *ngIf="!groupWiki" name="fas-user"></ion-icon>
|
<ion-icon *ngIf="!groupWiki" name="fas-user" aria-hidden="true"></ion-icon>
|
||||||
<ion-icon *ngIf="groupWiki" name="fas-users"></ion-icon>
|
<ion-icon *ngIf="groupWiki" name="fas-users" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
|
|
||||||
<ion-button *ngIf="loaded && currentPageObj" (click)="openMap()" [attr.aria-label]="'addon.mod_wiki.map' | translate"
|
<ion-button *ngIf="loaded && currentPageObj" (click)="openMap()" [attr.aria-label]="'addon.mod_wiki.map' | translate"
|
||||||
aria-haspopup="true">
|
aria-haspopup="true">
|
||||||
<ion-icon name="fas-map"></ion-icon>
|
<ion-icon name="fas-map" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
|
|
||||||
<core-context-menu>
|
<core-context-menu>
|
||||||
|
@ -55,7 +55,7 @@
|
||||||
<!-- 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>
|
||||||
<ion-icon name="fas-exclamation-triangle" slot="start"></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>
|
||||||
<span *ngIf="!pageIsOffline">{{ 'core.hasdatatosync' | translate:{$a: moduleName} }}</span>
|
<span *ngIf="!pageIsOffline">{{ 'core.hasdatatosync' | translate:{$a: moduleName} }}</span>
|
||||||
|
@ -66,7 +66,7 @@
|
||||||
<!-- Page warning. -->
|
<!-- Page warning. -->
|
||||||
<ion-card class="core-warning-card" *ngIf="pageWarning">
|
<ion-card class="core-warning-card" *ngIf="pageWarning">
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-icon name="fas-exclamation-triangle" slot="start"></ion-icon>
|
<ion-icon name="fas-exclamation-triangle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>{{ pageWarning }}</ion-label>
|
<ion-label>{{ pageWarning }}</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
@ -90,6 +90,6 @@
|
||||||
|
|
||||||
<ion-fab slot="fixed" core-fab vertical="bottom" horizontal="end" *ngIf="canEdit">
|
<ion-fab slot="fixed" core-fab vertical="bottom" horizontal="end" *ngIf="canEdit">
|
||||||
<ion-fab-button (click)="goToNewPage()" [attr.aria-label]="'addon.mod_wiki.createpage' | translate">
|
<ion-fab-button (click)="goToNewPage()" [attr.aria-label]="'addon.mod_wiki.createpage' | translate">
|
||||||
<ion-icon name="fas-plus"></ion-icon>
|
<ion-icon name="fas-plus" aria-hidden="true"></ion-icon>
|
||||||
</ion-fab-button>
|
</ion-fab-button>
|
||||||
</ion-fab>
|
</ion-fab>
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
<ion-title>{{ 'addon.mod_wiki.map' | translate }}</ion-title>
|
<ion-title>{{ 'addon.mod_wiki.map' | translate }}</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
<ion-button (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
||||||
<ion-icon name="fas-times"></ion-icon>
|
<ion-icon name="fas-times" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
|
@ -13,7 +13,7 @@
|
||||||
<ion-list>
|
<ion-list>
|
||||||
<!-- Go to "home". -->
|
<!-- Go to "home". -->
|
||||||
<ion-item class="ion-text-wrap" *ngIf="homeView" (click)="goToWikiHome()" tappable>
|
<ion-item class="ion-text-wrap" *ngIf="homeView" (click)="goToWikiHome()" tappable>
|
||||||
<ion-icon name="fas-home" slot="start"></ion-icon>
|
<ion-icon name="fas-home" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>{{ 'addon.mod_wiki.gowikihome' | translate }}</ion-label>
|
<ion-label>{{ 'addon.mod_wiki.gowikihome' | translate }}</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ng-container *ngFor="let letter of map">
|
<ng-container *ngFor="let letter of map">
|
||||||
|
@ -22,14 +22,14 @@
|
||||||
</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)"
|
||||||
[class.core-selected-item]="selectedTitle == page.title" tappable>
|
[class.core-selected-item]="selectedTitle == page.title" tappable>
|
||||||
<ion-icon name="fas-home" slot="start" *ngIf="page.firstpage"></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">
|
||||||
<ion-icon name="fas-clock"></ion-icon>
|
<ion-icon name="fas-clock" aria-hidden="true"></ion-icon>
|
||||||
<span class="ion-text-wrap">{{ 'core.notsent' | translate }}</span>
|
<span class="ion-text-wrap">{{ 'core.notsent' | translate }}</span>
|
||||||
</ion-note>
|
</ion-note>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
[attr.disabled]="!subwiki.canedit && subwiki.id <= 0 ? true : null" tappable
|
[attr.disabled]="!subwiki.canedit && subwiki.id <= 0 ? true : null" tappable
|
||||||
[class.core-selected-item]="isSubwikiSelected(subwiki)" detail="false">
|
[class.core-selected-item]="isSubwikiSelected(subwiki)" detail="false">
|
||||||
<ion-label>{{ subwiki.name }}</ion-label>
|
<ion-label>{{ subwiki.name }}</ion-label>
|
||||||
<ion-icon *ngIf="isSubwikiSelected(subwiki)" name="fas-check" slot="end"></ion-icon>
|
<ion-icon *ngIf="isSubwikiSelected(subwiki)" name="fas-check" slot="end" aria-hidden="true"></ion-icon>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
</ion-list>
|
</ion-list>
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
<ion-note slot="end" *ngIf="offline">
|
<ion-note slot="end" *ngIf="offline">
|
||||||
<ion-icon name="fas-clock"></ion-icon>{{ 'core.notsent' | translate }}
|
<ion-icon name="fas-clock" aria-hidden="true"></ion-icon>{{ 'core.notsent' | translate }}
|
||||||
</ion-note>
|
</ion-note>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</core-loading>
|
</core-loading>
|
||||||
|
|
|
@ -37,15 +37,19 @@
|
||||||
phases[workshop!.phase].tasks.length">
|
phases[workshop!.phase].tasks.length">
|
||||||
<ion-item class="ion-text-wrap" *ngFor="let task of phases[workshop!.phase].tasks"
|
<ion-item class="ion-text-wrap" *ngFor="let task of phases[workshop!.phase].tasks"
|
||||||
[class.item-dimmed]="task.code == 'submit' && !showSubmit" (click)="runTask(task)" detail="false">
|
[class.item-dimmed]="task.code == 'submit' && !showSubmit" (click)="runTask(task)" detail="false">
|
||||||
<ion-icon slot="start" name="far-circle" *ngIf="task.completed == null"></ion-icon>
|
<ion-icon slot="start" name="far-circle" *ngIf="task.completed == null" aria-hidden="true"></ion-icon>
|
||||||
<ion-icon slot="start" name="fas-times-circle" color="danger" *ngIf="task.completed == ''"></ion-icon>
|
<ion-icon slot="start" name="fas-times-circle" color="danger" *ngIf="task.completed == ''" aria-hidden="true">
|
||||||
<ion-icon slot="start" name="fas-info-circle" color="info" *ngIf="task.completed == 'info'"></ion-icon>
|
</ion-icon>
|
||||||
<ion-icon slot="start" name="fas-check-circle" color="success" *ngIf="task.completed == '1'"></ion-icon>
|
<ion-icon slot="start" name="fas-info-circle" color="info" *ngIf="task.completed == 'info'" aria-hidden="true">
|
||||||
|
</ion-icon>
|
||||||
|
<ion-icon slot="start" name="fas-check-circle" color="success" *ngIf="task.completed == '1'" aria-hidden="true">
|
||||||
|
</ion-icon>
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<h2>{{task.title}}</h2>
|
<h2>{{task.title}}</h2>
|
||||||
<p *ngIf="task.details" [innerHTML]="task.details"></p>
|
<p *ngIf="task.details" [innerHTML]="task.details"></p>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
<ion-icon slot="end" *ngIf="task.link && task.code != 'submit'" name="fas-external-link-alt"></ion-icon>
|
<ion-icon slot="end" *ngIf="task.link && task.code != 'submit'" name="fas-external-link-alt" aria-hidden="true">
|
||||||
|
</ion-icon>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
@ -53,7 +57,7 @@
|
||||||
<!-- Has something offline. -->
|
<!-- Has something offline. -->
|
||||||
<ion-card class="core-warning-card" *ngIf="hasOffline">
|
<ion-card class="core-warning-card" *ngIf="hasOffline">
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-icon name="fas-exclamation-triangle" slot="start"></ion-icon>
|
<ion-icon name="fas-exclamation-triangle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>{{ 'core.hasdatatosync' | translate: {$a: moduleName} }}</ion-label>
|
<ion-label>{{ 'core.hasdatatosync' | translate: {$a: moduleName} }}</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
@ -145,11 +149,11 @@
|
||||||
<ion-item class="ion-text-wrap" *ngIf="showSubmit">
|
<ion-item class="ion-text-wrap" *ngIf="showSubmit">
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<ion-button expand="block" *ngIf="access.creatingsubmissionallowed && !submission" (click)="gotoSubmit()">
|
<ion-button expand="block" *ngIf="access.creatingsubmissionallowed && !submission" (click)="gotoSubmit()">
|
||||||
<ion-icon slot="start" name="fas-plus"></ion-icon>
|
<ion-icon slot="start" name="fas-plus" aria-hidden="true"></ion-icon>
|
||||||
{{ 'addon.mod_workshop.createsubmission' | translate }}
|
{{ 'addon.mod_workshop.createsubmission' | translate }}
|
||||||
</ion-button>
|
</ion-button>
|
||||||
<ion-button expand="block" *ngIf="access.modifyingsubmissionallowed && submission" (click)="gotoSubmit()">
|
<ion-button expand="block" *ngIf="access.modifyingsubmissionallowed && submission" (click)="gotoSubmit()">
|
||||||
<ion-icon slot="start" name="fas-edit"></ion-icon>
|
<ion-icon slot="start" name="fas-edit" aria-hidden="true"></ion-icon>
|
||||||
{{ 'addon.mod_workshop.editsubmission' | translate }}
|
{{ 'addon.mod_workshop.editsubmission' | translate }}
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
|
@ -233,14 +237,14 @@
|
||||||
<ion-row class="ion-align-items-center">
|
<ion-row class="ion-align-items-center">
|
||||||
<ion-col *ngIf="page > 0">
|
<ion-col *ngIf="page > 0">
|
||||||
<ion-button expand="block" fill="outline" (click)="gotoSubmissionsPage(page! -1)">
|
<ion-button expand="block" fill="outline" (click)="gotoSubmissionsPage(page! -1)">
|
||||||
<ion-icon name="fas-chevron-left" slot="start"></ion-icon>
|
<ion-icon name="fas-chevron-left" slot="start" aria-hidden="true"></ion-icon>
|
||||||
{{ 'core.previous' | translate }}
|
{{ 'core.previous' | translate }}
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-col>
|
</ion-col>
|
||||||
<ion-col *ngIf="hasNextPage">
|
<ion-col *ngIf="hasNextPage">
|
||||||
<ion-button expand="block" (click)="gotoSubmissionsPage(page! + 1)">
|
<ion-button expand="block" (click)="gotoSubmissionsPage(page! + 1)">
|
||||||
{{ 'core.next' | translate }}
|
{{ 'core.next' | translate }}
|
||||||
<ion-icon name="fas-chevron-right" slot="end"></ion-icon>
|
<ion-icon name="fas-chevron-right" slot="end" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-col>
|
</ion-col>
|
||||||
</ion-row>
|
</ion-row>
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
<ion-title>{{ 'addon.mod_workshop.userplan' | translate }}</ion-title>
|
<ion-title>{{ 'addon.mod_workshop.userplan' | translate }}</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
<ion-button (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
||||||
<ion-icon name="fas-times" slot="icon-only"></ion-icon>
|
<ion-icon name="fas-times" slot="icon-only" aria-hidden=true></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
|
@ -23,25 +23,29 @@
|
||||||
</ion-label>
|
</ion-label>
|
||||||
</ion-item-divider>
|
</ion-item-divider>
|
||||||
<ion-item class="ion-text-wrap" *ngIf="phase.switchUrl" [href]="phase.switchUrl" detail="false">
|
<ion-item class="ion-text-wrap" *ngIf="phase.switchUrl" [href]="phase.switchUrl" detail="false">
|
||||||
<ion-icon slot="start" name="fas-exchange-alt"></ion-icon>
|
<ion-icon slot="start" name="fas-exchange-alt" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<p>{{ 'addon.mod_workshop.switchphase' + phase.code | translate }}</p>
|
<p>{{ 'addon.mod_workshop.switchphase' + phase.code | translate }}</p>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
<ion-icon slot="end" name="fas-external-link-alt"></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)" detail="false">
|
(click)="runTask(task)" detail="false">
|
||||||
<ion-icon slot="start" name="far-circle" *ngIf="task.completed == null"></ion-icon>
|
<ion-icon slot="start" name="far-circle" *ngIf="task.completed == null"
|
||||||
<ion-icon slot="start" name="fas-times-circle" color="danger" *ngIf="task.completed == ''"></ion-icon>
|
[attr.aria-label]="'addon.mod_workshop.tasktodo' | translate"></ion-icon>
|
||||||
<ion-icon slot="start" name="fas-info-circle" color="info" *ngIf="task.completed == 'info'"></ion-icon>
|
<ion-icon slot="start" name="fas-times-circle" color="danger" *ngIf="task.completed == ''"
|
||||||
<ion-icon slot="start" name="fas-check-circle" color="success" *ngIf="task.completed == '1'"></ion-icon>
|
[attr.aria-label]="'addon.mod_workshop.taskfail' | translate"></ion-icon>
|
||||||
|
<ion-icon slot="start" name="fas-info-circle" color="info" *ngIf="task.completed == 'info'"
|
||||||
|
[attr.aria-label]="'addon.mod_workshop.taskinfo' | translate"></ion-icon>
|
||||||
|
<ion-icon slot="start" name="fas-check-circle" color="success" *ngIf="task.completed == '1'"
|
||||||
|
[attr.aria-label]="'addon.mod_workshop.taskdone' | translate"></ion-icon>
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<h2 class="ion-text-wrap">{{task.title}}</h2>
|
<h2 class="ion-text-wrap">{{task.title}}</h2>
|
||||||
<p *ngIf="task.details" [innerHTML]="task.details"></p>
|
<p *ngIf="task.details" [innerHTML]="task.details"></p>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
<ion-icon slot="end" *ngIf="task.link && task.code != 'submit'" name="fas-external-link-alt"></ion-icon>
|
<ion-icon slot="end" *ngIf="task.link && task.code != 'submit'" name="fas-external-link-alt" aria-hidden="true">
|
||||||
|
</ion-icon>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
</ion-list>
|
</ion-list>
|
||||||
|
|
|
@ -22,15 +22,15 @@
|
||||||
</p>
|
</p>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
<ion-note slot="end" *ngIf="!submission.timemodified">
|
<ion-note slot="end" *ngIf="!submission.timemodified">
|
||||||
<ion-icon name="fas-clock"></ion-icon> {{ 'core.notsent' | translate }}
|
<ion-icon name="fas-clock" aria-hidden="true"></ion-icon> {{ 'core.notsent' | translate }}
|
||||||
</ion-note>
|
</ion-note>
|
||||||
<ion-note slot="end" *ngIf="submission.timemodified">
|
<ion-note slot="end" *ngIf="submission.timemodified">
|
||||||
{{submission.timemodified | coreDateDayOrTime}}
|
{{submission.timemodified | coreDateDayOrTime}}
|
||||||
<ng-container *ngIf="submission.offline">
|
<ng-container *ngIf="submission.offline">
|
||||||
<ion-icon name="fas-clock"></ion-icon> {{ 'core.notsent' | translate }}
|
<ion-icon name="fas-clock" aria-hidden="true"></ion-icon> {{ 'core.notsent' | translate }}
|
||||||
</ng-container>
|
</ng-container>
|
||||||
<ng-container *ngIf="submission.deleted">
|
<ng-container *ngIf="submission.deleted">
|
||||||
<ion-icon name="fas-trash"></ion-icon> {{ 'core.deletedoffline' | translate }}
|
<ion-icon name="fas-trash" aria-hidden="true"></ion-icon> {{ 'core.deletedoffline' | translate }}
|
||||||
</ng-container>
|
</ng-container>
|
||||||
</ion-note>
|
</ion-note>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
@ -59,7 +59,7 @@
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<ion-button expand="block" (click)="gotoSubmission()">
|
<ion-button expand="block" (click)="gotoSubmission()">
|
||||||
{{ 'core.showmore' | translate }}
|
{{ 'core.showmore' | translate }}
|
||||||
<ion-icon name="fas-chevron-right" slot="end"></ion-icon>
|
<ion-icon name="fas-chevron-right" slot="end" aria-hidden="true"></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
@ -101,8 +101,10 @@
|
||||||
</ion-label>
|
</ion-label>
|
||||||
<ion-note slot="end" *ngIf="submission.timemodified">
|
<ion-note slot="end" *ngIf="submission.timemodified">
|
||||||
{{submission.timemodified | coreDateDayOrTime}}
|
{{submission.timemodified | coreDateDayOrTime}}
|
||||||
<div *ngIf="offline"><ion-icon name="fas-clock"></ion-icon> {{ 'core.notsent' | translate }}</div>
|
<div *ngIf="offline"><ion-icon name="fas-clock" aria-hidden="true"></ion-icon> {{ 'core.notsent' | translate }}</div>
|
||||||
<div *ngIf="submission.deleted"><ion-icon name="fas-trash"></ion-icon> {{ 'core.deletedoffline' | translate }}</div>
|
<div *ngIf="submission.deleted">
|
||||||
|
<ion-icon name="fas-trash" aria-hidden="true"></ion-icon> {{ 'core.deletedoffline' | translate }}
|
||||||
|
</div>
|
||||||
</ion-note>
|
</ion-note>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</core-loading>
|
</core-loading>
|
||||||
|
|
|
@ -51,6 +51,10 @@
|
||||||
"switchphase30": "Switch to the assessment phase",
|
"switchphase30": "Switch to the assessment phase",
|
||||||
"switchphase40": "Switch to the evaluation phase",
|
"switchphase40": "Switch to the evaluation phase",
|
||||||
"switchphase50": "Close workshop",
|
"switchphase50": "Close workshop",
|
||||||
|
"taskdone": "Task done",
|
||||||
|
"taskfail": "Task fail",
|
||||||
|
"taskinfo": "Task info",
|
||||||
|
"tasktodo": "Task to do",
|
||||||
"userplan": "Workshop planner",
|
"userplan": "Workshop planner",
|
||||||
"userplancurrentphase": "Current phase",
|
"userplancurrentphase": "Current phase",
|
||||||
"warningassessmentmodified": "The submission was modified on the site.",
|
"warningassessmentmodified": "The submission was modified on the site.",
|
||||||
|
|
|
@ -31,16 +31,16 @@
|
||||||
<ion-item class="ion-text-wrap" *ngIf="canEdit || canDelete">
|
<ion-item class="ion-text-wrap" *ngIf="canEdit || canDelete">
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<ion-button expand="block" *ngIf="canEdit" (click)="editSubmission()">
|
<ion-button expand="block" *ngIf="canEdit" (click)="editSubmission()">
|
||||||
<ion-icon name="fas-edit" slot="start"></ion-icon>
|
<ion-icon name="fas-edit" slot="start" aria-hidden="true"></ion-icon>
|
||||||
{{ 'addon.mod_workshop.editsubmission' | translate }}
|
{{ 'addon.mod_workshop.editsubmission' | translate }}
|
||||||
</ion-button>
|
</ion-button>
|
||||||
<ion-button expand="block" *ngIf="!submission.deleted && canDelete" color="danger" (click)="deleteSubmission()">
|
<ion-button expand="block" *ngIf="!submission.deleted && canDelete" color="danger" (click)="deleteSubmission()">
|
||||||
<ion-icon name="fas-trash" slot="start"></ion-icon>
|
<ion-icon name="fas-trash" slot="start" aria-hidden="true"></ion-icon>
|
||||||
{{ 'addon.mod_workshop.deletesubmission' | translate }}
|
{{ 'addon.mod_workshop.deletesubmission' | translate }}
|
||||||
</ion-button>
|
</ion-button>
|
||||||
<ion-button expand="block" fill="outline" *ngIf="submission.deleted && canDelete" color="danger"
|
<ion-button expand="block" fill="outline" *ngIf="submission.deleted && canDelete" color="danger"
|
||||||
(click)="undoDeleteSubmission()">
|
(click)="undoDeleteSubmission()">
|
||||||
<ion-icon name="fas-undo-alt" slot="start"></ion-icon>
|
<ion-icon name="fas-undo-alt" slot="start" aria-hidden="true"></ion-icon>
|
||||||
{{ 'core.restore' | translate }}
|
{{ 'core.restore' | translate }}
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
<ion-title>{{ 'addon.notes.addnewnote' | translate }}</ion-title>
|
<ion-title>{{ 'addon.notes.addnewnote' | translate }}</ion-title>
|
||||||
<ion-buttons slot="end">
|
<ion-buttons slot="end">
|
||||||
<ion-button (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
<ion-button (click)="closeModal()" [attr.aria-label]="'core.close' | translate">
|
||||||
<ion-icon name="fas-times" slot="icon-only"></ion-icon>
|
<ion-icon name="fas-times" slot="icon-only" aria-hidden=true></ion-icon>
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-buttons>
|
</ion-buttons>
|
||||||
</ion-toolbar>
|
</ion-toolbar>
|
||||||
|
|
|
@ -11,8 +11,8 @@
|
||||||
</ion-header>
|
</ion-header>
|
||||||
<core-navbar-buttons slot="end">
|
<core-navbar-buttons slot="end">
|
||||||
<ion-button [hidden]="!canDeleteNotes" slot="end" fill="clear" (click)="toggleDelete()"
|
<ion-button [hidden]="!canDeleteNotes" slot="end" fill="clear" (click)="toggleDelete()"
|
||||||
[attr.aria-label]="'core.delete' | translate">
|
[attr.aria-label]="'core.toggledelete' | translate">
|
||||||
<ion-icon name="fas-pen" slot="icon-only"></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"
|
||||||
|
@ -45,7 +45,7 @@
|
||||||
|
|
||||||
<ion-card class="core-warning-card" *ngIf="hasOffline">
|
<ion-card class="core-warning-card" *ngIf="hasOffline">
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-icon name="fas-exclamation-triangle" slot="start"></ion-icon>
|
<ion-icon name="fas-exclamation-triangle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>
|
<ion-label>
|
||||||
{{ 'core.thereisdatatosync' | translate:{$a: 'addon.notes.notes' | translate | lowercase } }}
|
{{ 'core.thereisdatatosync' | translate:{$a: 'addon.notes.notes' | translate | lowercase } }}
|
||||||
</ion-label>
|
</ion-label>
|
||||||
|
@ -66,23 +66,23 @@
|
||||||
</p>
|
</p>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
<p *ngIf="note.offline" slot="end">
|
<p *ngIf="note.offline" slot="end">
|
||||||
<ion-icon name="far-clock"></ion-icon> <span class="ion-text-wrap">
|
<ion-icon name="fas-clock" aria-hidden="true"></ion-icon> <span class="ion-text-wrap">
|
||||||
{{ 'core.notsent' | translate }}
|
{{ 'core.notsent' | translate }}
|
||||||
</span>
|
</span>
|
||||||
</p>
|
</p>
|
||||||
<p *ngIf="note.deleted" slot="end">
|
<p *ngIf="note.deleted" slot="end">
|
||||||
<ion-icon name="fas-trash"></ion-icon> <span class="ion-text-wrap">
|
<ion-icon name="fas-trash" aria-hidden="true"></ion-icon> <span class="ion-text-wrap">
|
||||||
{{ 'core.deletedoffline' | translate }}
|
{{ 'core.deletedoffline' | translate }}
|
||||||
</span>
|
</span>
|
||||||
</p>
|
</p>
|
||||||
<ion-button *ngIf="note.deleted" slot="end" fill="clear" color="danger" (click)="undoDeleteNote($event, note)"
|
<ion-button *ngIf="note.deleted" slot="end" fill="clear" color="danger" (click)="undoDeleteNote($event, note)"
|
||||||
[attr.aria-label]="'core.restore' | translate">
|
[attr.aria-label]="'core.restore' | translate">
|
||||||
<ion-icon name="fas-undo-alt" slot="icon-only"></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" fill="clear" [@coreSlideInOut]="'fromRight'" color="danger" (click)="deleteNote($event, note)"
|
slot="end" 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"></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">
|
||||||
|
@ -94,7 +94,7 @@
|
||||||
|
|
||||||
<ion-fab slot="fixed" core-fab vertical="bottom" horizontal="end" *ngIf="userId && notesLoaded">
|
<ion-fab slot="fixed" core-fab vertical="bottom" horizontal="end" *ngIf="userId && notesLoaded">
|
||||||
<ion-fab-button (click)="addNote($event)" [attr.aria-label]="'addon.notes.addnewnote' |translate">
|
<ion-fab-button (click)="addNote($event)" [attr.aria-label]="'addon.notes.addnewnote' |translate">
|
||||||
<ion-icon name="fas-plus"></ion-icon>
|
<ion-icon name="fas-plus" aria-hidden="true"></ion-icon>
|
||||||
</ion-fab-button>
|
</ion-fab-button>
|
||||||
</ion-fab>
|
</ion-fab>
|
||||||
</ion-content>
|
</ion-content>
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<ion-row *ngIf="actions && actions.length > 0" class="justify-content-around">
|
<ion-row *ngIf="actions && actions.length > 0" class="justify-content-around">
|
||||||
<ion-col *ngFor="let action of actions">
|
<ion-col *ngFor="let action of actions">
|
||||||
<ion-button fill="clear" expand="block" (click)="action.action()">
|
<ion-button fill="clear" expand="block" (click)="action.action()">
|
||||||
<ion-icon slot="start" name="{{action.icon}}"></ion-icon>
|
<ion-icon slot="start" name="{{action.icon}}" aria-hidden="true"></ion-icon>
|
||||||
{{ action.message | translate }}
|
{{ action.message | translate }}
|
||||||
</ion-button>
|
</ion-button>
|
||||||
</ion-col>
|
</ion-col>
|
||||||
|
|
|
@ -4,5 +4,6 @@
|
||||||
"notificationpreferences": "Notification preferences",
|
"notificationpreferences": "Notification preferences",
|
||||||
"notifications": "Notifications",
|
"notifications": "Notifications",
|
||||||
"playsound": "Play sound",
|
"playsound": "Play sound",
|
||||||
"therearentnotificationsyet": "There are no notifications."
|
"therearentnotificationsyet": "There are no notifications.",
|
||||||
|
"unreadnotification": "Unread notification: {{$a}}"
|
||||||
}
|
}
|
|
@ -14,7 +14,7 @@
|
||||||
<div class="ion-padding" *ngIf="canMarkAllNotificationsAsRead">
|
<div class="ion-padding" *ngIf="canMarkAllNotificationsAsRead">
|
||||||
<ion-button *ngIf="!loadingMarkAllNotificationsAsRead" expand="block" (click)="markAllNotificationsAsRead()"
|
<ion-button *ngIf="!loadingMarkAllNotificationsAsRead" expand="block" (click)="markAllNotificationsAsRead()"
|
||||||
color="light">
|
color="light">
|
||||||
<ion-icon slot="start" name="fas-check"></ion-icon>
|
<ion-icon slot="start" name="fas-check" aria-hidden="true"></ion-icon>
|
||||||
{{ 'addon.notifications.markallread' | translate }}
|
{{ 'addon.notifications.markallread' | translate }}
|
||||||
</ion-button>
|
</ion-button>
|
||||||
<ion-button *ngIf="loadingMarkAllNotificationsAsRead" expand="block" color="light">
|
<ion-button *ngIf="loadingMarkAllNotificationsAsRead" expand="block" color="light">
|
||||||
|
@ -23,7 +23,11 @@
|
||||||
</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]="
|
||||||
|
notification.timeread
|
||||||
|
? notification.subject
|
||||||
|
: 'addon.notifications.unreadnotification' | translate: {$a: notification.subject}">
|
||||||
<core-user-avatar *ngIf="notification.useridfrom > 0" [user]="notification" slot="start"
|
<core-user-avatar *ngIf="notification.useridfrom > 0" [user]="notification" slot="start"
|
||||||
[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>
|
||||||
|
@ -38,8 +42,7 @@
|
||||||
<ion-note slot="end" class="ion-float-end ion-padding-left ion-text-end">
|
<ion-note slot="end" class="ion-float-end ion-padding-left ion-text-end">
|
||||||
{{ notification.timecreated | coreDateDayOrTime }}
|
{{ notification.timecreated | coreDateDayOrTime }}
|
||||||
<span *ngIf="!notification.timeread">
|
<span *ngIf="!notification.timeread">
|
||||||
<ion-icon name="fas-circle" color="primary">
|
<ion-icon name="fas-circle" color="primary" aria-hidden="true"></ion-icon>
|
||||||
</ion-icon>
|
|
||||||
</span>
|
</span>
|
||||||
</ion-note>
|
</ion-note>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
|
|
@ -49,7 +49,7 @@
|
||||||
<!-- Upload a private file. -->
|
<!-- Upload a private file. -->
|
||||||
<ion-fab slot="fixed" core-fab vertical="bottom" horizontal="end" *ngIf="showUpload && root != 'site' && !path">
|
<ion-fab slot="fixed" core-fab vertical="bottom" horizontal="end" *ngIf="showUpload && root != 'site' && !path">
|
||||||
<ion-fab-button (click)="uploadFile()" [attr.aria-label]="'core.fileuploader.uploadafile' | translate">
|
<ion-fab-button (click)="uploadFile()" [attr.aria-label]="'core.fileuploader.uploadafile' | translate">
|
||||||
<ion-icon name="fas-plus"></ion-icon>
|
<ion-icon name="fas-plus" aria-hidden="true"></ion-icon>
|
||||||
</ion-fab-button>
|
</ion-fab-button>
|
||||||
</ion-fab>
|
</ion-fab>
|
||||||
</ion-content>
|
</ion-content>
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<ion-card *ngIf="!ddQuestion.readOnly" class="core-info-card">
|
<ion-card *ngIf="!ddQuestion.readOnly" class="core-info-card">
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-icon name="fas-info-circle" slot="start"></ion-icon>
|
<ion-icon name="fas-info-circle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>{{ 'core.question.howtodraganddrop' | translate }}</ion-label>
|
<ion-label>{{ 'core.question.howtodraganddrop' | translate }}</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<ion-card *ngIf="!ddQuestion.readOnly" class="core-info-card">
|
<ion-card *ngIf="!ddQuestion.readOnly" class="core-info-card">
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-icon name="fas-info-circle" slot="start"></ion-icon>
|
<ion-icon name="fas-info-circle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>{{ 'core.question.howtodraganddrop' | translate }}</ion-label>
|
<ion-label>{{ 'core.question.howtodraganddrop' | translate }}</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<ion-card *ngIf="!ddQuestion.readOnly" class="core-info-card">
|
<ion-card *ngIf="!ddQuestion.readOnly" class="core-info-card">
|
||||||
<ion-item>
|
<ion-item>
|
||||||
<ion-icon name="fas-info-circle" slot="start"></ion-icon>
|
<ion-icon name="fas-info-circle" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>{{ 'core.question.howtodraganddrop' | translate }}</ion-label>
|
<ion-label>{{ 'core.question.howtodraganddrop' | translate }}</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</ion-card>
|
</ion-card>
|
||||||
|
|
|
@ -23,7 +23,9 @@
|
||||||
{{option.label}}
|
{{option.label}}
|
||||||
</ion-select-option>
|
</ion-select-option>
|
||||||
</ion-select>
|
</ion-select>
|
||||||
<ion-icon *ngIf="row.isCorrect === 1" class="core-correct-icon" name="fas-check" color="success" slot="end"></ion-icon>
|
<ion-icon *ngIf="row.isCorrect === 1" class="core-correct-icon" name="fas-check" color="success" slot="end"
|
||||||
<ion-icon *ngIf="row.isCorrect === 0" class="core-correct-icon" name="fas-times" color="danger" slot="end"></ion-icon>
|
[attr.aria-label]="'core.question.correct' | translate"></ion-icon>
|
||||||
|
<ion-icon *ngIf="row.isCorrect === 0" class="core-correct-icon" name="fas-times" color="danger" slot="end"
|
||||||
|
[attr.aria-label]="'core.question.incorrect' | translate"></ion-icon>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
</section>
|
</section>
|
||||||
|
|
|
@ -27,8 +27,10 @@
|
||||||
[color]='(option.isCorrect === 1 ? "success": "") + (option.isCorrect === 0 ? "danger": "")'>
|
[color]='(option.isCorrect === 1 ? "success": "") + (option.isCorrect === 0 ? "danger": "")'>
|
||||||
</ion-checkbox>
|
</ion-checkbox>
|
||||||
|
|
||||||
<ion-icon *ngIf="option.isCorrect === 1" class="core-correct-icon" name="fas-check" color="success"></ion-icon>
|
<ion-icon *ngIf="option.isCorrect === 1" class="core-correct-icon" name="fas-check" color="success"
|
||||||
<ion-icon *ngIf="option.isCorrect === 0" class="core-correct-icon" name="fas-times" color="danger"></ion-icon>
|
[attr.aria-label]="'core.question.correct' | translate"></ion-icon>
|
||||||
|
<ion-icon *ngIf="option.isCorrect === 0" class="core-correct-icon" name="fas-times" color="danger"
|
||||||
|
[attr.aria-label]="'core.question.incorrect' | translate"></ion-icon>
|
||||||
|
|
||||||
<!-- ion-checkbox doesn't use an input. Create a hidden input to hold the value. -->
|
<!-- ion-checkbox doesn't use an input. Create a hidden input to hold the value. -->
|
||||||
<input type="hidden" [ngModel]="option.checked" [attr.name]="option.name">
|
<input type="hidden" [ngModel]="option.checked" [attr.name]="option.name">
|
||||||
|
@ -53,8 +55,10 @@
|
||||||
[color]='(option.isCorrect === 1 ? "success": "") + (option.isCorrect === 0 ? "danger": "")'>
|
[color]='(option.isCorrect === 1 ? "success": "") + (option.isCorrect === 0 ? "danger": "")'>
|
||||||
</ion-radio>
|
</ion-radio>
|
||||||
|
|
||||||
<ion-icon *ngIf="option.isCorrect === 1" class="core-correct-icon" name="fas-check" color="success"></ion-icon>
|
<ion-icon *ngIf="option.isCorrect === 1" class="core-correct-icon" name="fas-check" color="success"
|
||||||
<ion-icon *ngIf="option.isCorrect === 0" class="core-correct-icon" name="fas-times" color="danger"></ion-icon>
|
[attr.aria-label]="'core.question.correct' | translate"></ion-icon>
|
||||||
|
<ion-icon *ngIf="option.isCorrect === 0" class="core-correct-icon" name="fas-times" color="danger"
|
||||||
|
[attr.aria-label]="'core.question.incorrect' | translate"></ion-icon>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ion-button *ngIf="!multiQuestion.disabled" class="ion-text-wrap ion-margin" expand="full" color="light"
|
<ion-button *ngIf="!multiQuestion.disabled" class="ion-text-wrap ion-margin" expand="full" color="light"
|
||||||
[disabled]="!multiQuestion.singleChoiceModel" (click)="clear()" type="reset">
|
[disabled]="!multiQuestion.singleChoiceModel" (click)="clear()" type="reset">
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
<ion-card-title *ngIf="!course.displayname">{{ course.fullname }}</ion-card-title>
|
<ion-card-title *ngIf="!course.displayname">{{ course.fullname }}</ion-card-title>
|
||||||
<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"></ion-icon>
|
<ion-icon name="fas-archive" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<h2 class="ion-text-wrap">{{ 'addon.storagemanager.storageused' | translate }}</h2>
|
<h2 class="ion-text-wrap">{{ 'addon.storagemanager.storageused' | translate }}</h2>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
|
@ -45,7 +45,7 @@
|
||||||
<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">
|
||||||
<img *ngIf="module.handlerData!.icon" [src]="module.handlerData!.icon" alt="" role="presentation"
|
<img *ngIf="module.handlerData!.icon" [src]="module.handlerData!.icon" [alt]="module.modNameTranslated"
|
||||||
class="core-module-icon" slot="start">
|
class="core-module-icon" slot="start">
|
||||||
<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">
|
||||||
|
|
|
@ -55,6 +55,8 @@ export class AddonStorageManagerCourseStoragePage implements OnInit {
|
||||||
section.modules.forEach((module) => {
|
section.modules.forEach((module) => {
|
||||||
module.parentSection = section;
|
module.parentSection = section;
|
||||||
module.totalSize = 0;
|
module.totalSize = 0;
|
||||||
|
module.modNameTranslated = CoreCourse.translateModuleName(module.modname) || '';
|
||||||
|
|
||||||
// Note: This function only gets the size for modules which are downloadable.
|
// Note: This function only gets the size for modules which are downloadable.
|
||||||
// For other modules it always returns 0, even if they have downloaded some files.
|
// For other modules it always returns 0, even if they have downloaded some files.
|
||||||
// However there is no 100% reliable way to actually track the files in this case.
|
// However there is no 100% reliable way to actually track the files in this case.
|
||||||
|
@ -225,4 +227,5 @@ type AddonStorageManagerCourseSection = Omit<CoreCourseSection, 'modules'> & {
|
||||||
type AddonStorageManagerModule = CoreCourseModule & {
|
type AddonStorageManagerModule = CoreCourseModule & {
|
||||||
parentSection?: AddonStorageManagerCourseSection;
|
parentSection?: AddonStorageManagerCourseSection;
|
||||||
totalSize?: number;
|
totalSize?: number;
|
||||||
|
modNameTranslated?: string;
|
||||||
};
|
};
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue