Merge pull request #1719 from crazyserver/MOBILE-2795

Mobile 2795
main
Juan Leyva 2019-01-10 14:54:34 +01:00 committed by GitHub
commit b5867fd011
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 80 additions and 32 deletions

View File

@ -52,19 +52,19 @@
</ion-card-content> </ion-card-content>
</ion-card> </ion-card>
<ion-card list *ngIf="notificationsEnabled"> <ion-card list *ngIf="notificationsEnabled && event.timestart - 600 > currentTime">
<ion-item> <ion-item>
<ion-label>{{ 'addon.calendar.notifications' | translate }}</ion-label> <ion-label>{{ 'addon.calendar.notifications' | translate }}</ion-label>
<ion-select [(ngModel)]="notificationTime" (ionChange)="updateNotificationTime($event)" interface="action-sheet"> <ion-select [(ngModel)]="notificationTime" (ionChange)="updateNotificationTime($event)" interface="action-sheet">
<ion-option value="-1">{{ 'core.defaultvalue' | translate :{$a: defaultTimeReadable} }}</ion-option> <ion-option value="-1" *ngIf="event.timestart - defaultTime > currentTime">{{ 'core.defaultvalue' | translate :{$a: defaultTimeReadable} }}</ion-option>
<ion-option value="0">{{ 'core.settings.disabled' | translate }}</ion-option> <ion-option value="0">{{ 'core.settings.disabled' | translate }}</ion-option>
<ion-option value="10">{{ 600 | coreDuration }}</ion-option> <ion-option value="10">{{ 600 | coreDuration }}</ion-option>
<ion-option value="30">{{ 1800 | coreDuration }}</ion-option> <ion-option value="30" *ngIf="event.timestart - 1800 > currentTime">{{ 1800 | coreDuration }}</ion-option>
<ion-option value="60">{{ 3600 | coreDuration }}</ion-option> <ion-option value="60" *ngIf="event.timestart - 3600 > currentTime">{{ 3600 | coreDuration }}</ion-option>
<ion-option value="120">{{ 7200 | coreDuration }}</ion-option> <ion-option value="120" *ngIf="event.timestart - 7200 > currentTime">{{ 7200 | coreDuration }}</ion-option>
<ion-option value="360">{{ 21600 | coreDuration }}</ion-option> <ion-option value="360" *ngIf="event.timestart - 21600 > currentTime">{{ 21600 | coreDuration }}</ion-option>
<ion-option value="720">{{ 43200 | coreDuration }}</ion-option> <ion-option value="720" *ngIf="event.timestart - 43200 > currentTime">{{ 43200 | coreDuration }}</ion-option>
<ion-option value="1440">{{ 86400 | coreDuration }}</ion-option> <ion-option value="1440" *ngIf="event.timestart - 86400 > currentTime">{{ 86400 | coreDuration }}</ion-option>
</ion-select> </ion-select>
</ion-item> </ion-item>
</ion-card> </ion-card>

View File

@ -48,12 +48,14 @@ export class AddonCalendarEventPage {
notificationsEnabled = false; notificationsEnabled = false;
moduleUrl = ''; moduleUrl = '';
categoryPath = ''; categoryPath = '';
currentTime: number;
defaultTime: number;
constructor(private translate: TranslateService, private calendarProvider: AddonCalendarProvider, navParams: NavParams, constructor(private translate: TranslateService, private calendarProvider: AddonCalendarProvider, navParams: NavParams,
private domUtils: CoreDomUtilsProvider, private coursesProvider: CoreCoursesProvider, timeUtils: CoreTimeUtilsProvider, private domUtils: CoreDomUtilsProvider, private coursesProvider: CoreCoursesProvider,
private calendarHelper: AddonCalendarHelperProvider, private sitesProvider: CoreSitesProvider, private calendarHelper: AddonCalendarHelperProvider, private sitesProvider: CoreSitesProvider,
localNotificationsProvider: CoreLocalNotificationsProvider, private courseProvider: CoreCourseProvider, localNotificationsProvider: CoreLocalNotificationsProvider, private courseProvider: CoreCourseProvider,
private textUtils: CoreTextUtilsProvider) { private textUtils: CoreTextUtilsProvider, private timeUtils: CoreTimeUtilsProvider) {
this.eventId = navParams.get('id'); this.eventId = navParams.get('id');
this.notificationsEnabled = localNotificationsProvider.isAvailable(); this.notificationsEnabled = localNotificationsProvider.isAvailable();
@ -61,9 +63,12 @@ export class AddonCalendarEventPage {
if (this.notificationsEnabled) { if (this.notificationsEnabled) {
this.calendarProvider.getEventNotificationTimeOption(this.eventId).then((notificationTime) => { this.calendarProvider.getEventNotificationTimeOption(this.eventId).then((notificationTime) => {
this.notificationTime = notificationTime; this.notificationTime = notificationTime;
this.loadNotificationTime();
}); });
this.calendarProvider.getDefaultNotificationTime().then((defaultTime) => { this.calendarProvider.getDefaultNotificationTime().then((defaultTime) => {
this.defaultTime = defaultTime * 60;
this.loadNotificationTime();
if (defaultTime === 0) { if (defaultTime === 0) {
// Disabled by default. // Disabled by default.
this.defaultTimeReadable = this.translate.instant('core.settings.disabled'); this.defaultTimeReadable = this.translate.instant('core.settings.disabled');
@ -111,6 +116,9 @@ export class AddonCalendarEventPage {
this.calendarHelper.formatEventData(event); this.calendarHelper.formatEventData(event);
this.event = event; this.event = event;
this.currentTime = this.timeUtils.timestamp();
this.loadNotificationTime();
// Reset some of the calculated data. // Reset some of the calculated data.
this.categoryPath = ''; this.categoryPath = '';
this.courseName = ''; this.courseName = '';
@ -178,6 +186,19 @@ export class AddonCalendarEventPage {
}); });
} }
/**
* Loads notification time by discarding options not in the list.
*/
loadNotificationTime(): void {
if (typeof this.notificationTime != 'undefined') {
if (this.notificationTime > 0 && this.event.timestart - this.notificationTime * 60 < this.currentTime) {
this.notificationTime = 0;
} else if (this.notificationTime < 0 && this.event.timestart - this.defaultTime < this.currentTime) {
this.notificationTime = 0;
}
}
}
/** /**
* Refresh the event. * Refresh the event.
* *

View File

@ -18,10 +18,14 @@
tr { tr {
@extend .row; @extend .row;
padding: 0; padding: 0;
@include media-breakpoint-down(sm) {
flex-direction: column;
}
} }
td, th { td, th {
@extend .col; @extend .col;
min-height: auto;
} }
} }

View File

@ -10,8 +10,8 @@
</ion-header> </ion-header>
<ion-content> <ion-content>
<div class="fixed-content core-tabs-bar"> <div class="fixed-content core-tabs-bar">
<a class="tab-slide" [attr.aria-selected]="!search.searchingAdvanced" (click)="toggleAdvanced()">{{ 'addon.mod_data.search' | translate}}</a> <a class="tab-slide" [attr.aria-selected]="!search.searchingAdvanced" (click)="changeAdvanced(false)">{{ 'addon.mod_data.search' | translate}}</a>
<a class="tab-slide" [attr.aria-selected]="search.searchingAdvanced" (click)="toggleAdvanced()">{{ 'addon.mod_data.advancedsearch' | translate }}</a> <a class="tab-slide" [attr.aria-selected]="search.searchingAdvanced" (click)="changeAdvanced(true)">{{ 'addon.mod_data.advancedsearch' | translate }}</a>
</div> </div>
<form (ngSubmit)="searchEntries($event)" [formGroup]="searchForm"> <form (ngSubmit)="searchEntries($event)" [formGroup]="searchForm">
<ion-list no-margin> <ion-list no-margin>

View File

@ -176,9 +176,11 @@ export class AddonModDataSearchPage {
/** /**
* Toggles between advanced to normal search. * Toggles between advanced to normal search.
*
* @param {boolean} advanced True for advanced, false for basic.
*/ */
toggleAdvanced(): void { changeAdvanced(advanced: boolean): void {
this.search.searchingAdvanced = !this.search.searchingAdvanced; this.search.searchingAdvanced = advanced;
} }
/** /**

View File

@ -57,7 +57,12 @@ export class AddonModUrlIndexComponent extends CoreCourseModuleMainResourceCompo
this.canGetUrl = this.urlProvider.isGetUrlWSAvailable(); this.canGetUrl = this.urlProvider.isGetUrlWSAvailable();
this.loadContent(); this.loadContent().then(() => {
if ((this.shouldIframe || (this.shouldEmbed && this.isOther)) ||
(!this.shouldIframe && (!this.shouldEmbed || !this.isOther))) {
this.logView();
}
});
} }
/** /**
@ -168,14 +173,23 @@ export class AddonModUrlIndexComponent extends CoreCourseModuleMainResourceCompo
} }
/** /**
* Opens a file. * Log view into the site and checks module completion.
*
* @return {Promise<void>} Promise resolved when done.
*/ */
go(): void { protected logView(): Promise<void> {
this.urlProvider.logView(this.module.instance).then(() => { return this.urlProvider.logView(this.module.instance).then(() => {
this.courseProvider.checkModuleCompletion(this.courseId, this.module.completiondata); this.courseProvider.checkModuleCompletion(this.courseId, this.module.completiondata);
}).catch(() => { }).catch(() => {
// Ignore errors. // Ignore errors.
}); });
}
/**
* Opens a file.
*/
go(): void {
this.logView();
this.urlHelper.open(this.url); this.urlHelper.open(this.url);
} }
} }

View File

@ -33,6 +33,9 @@ ion-app.app-root {
.img-responsive { .img-responsive {
display: block; display: block;
max-width: 100%; max-width: 100%;
&[height] {
height: auto;
}
} }
.opacity-hide { opacity: 0; } .opacity-hide { opacity: 0; }

View File

@ -297,6 +297,8 @@ export class CoreCourseFormatComponent implements OnInit, OnChanges, OnDestroy {
setTimeout(() => { setTimeout(() => {
this.domUtils.scrollToElementBySelector(this.content, '#core-course-module-' + this.moduleId); this.domUtils.scrollToElementBySelector(this.content, '#core-course-module-' + this.moduleId);
}, 200); }, 200);
} else {
this.domUtils.scrollToTop(this.content, 0);
} }
} }

View File

@ -80,6 +80,7 @@ export class CoreFormatTextDirective implements OnChanges {
*/ */
ngOnChanges(changes: { [name: string]: SimpleChange }): void { ngOnChanges(changes: { [name: string]: SimpleChange }): void {
if (changes.text) { if (changes.text) {
this.hideShowMore();
this.formatAndRenderContents(); this.formatAndRenderContents();
} }
} }

View File

@ -298,7 +298,7 @@ export class CoreLocalNotificationsProvider {
return this.appDB.getRecord(this.TRIGGERED_TABLE, { id: notification.id }).then((stored) => { return this.appDB.getRecord(this.TRIGGERED_TABLE, { id: notification.id }).then((stored) => {
return stored.at === notification.at.getTime() / 1000; return stored.at === notification.at.getTime() / 1000;
}).catch(() => { }).catch(() => {
return false; return this.localNotifications.isTriggered(notification.id);
}); });
} }
@ -478,22 +478,23 @@ export class CoreLocalNotificationsProvider {
protected scheduleNotification(notification: CoreILocalNotification): Promise<any> { protected scheduleNotification(notification: CoreILocalNotification): Promise<any> {
// Check if the notification has been triggered already. // Check if the notification has been triggered already.
return this.isTriggered(notification).then((triggered) => { return this.isTriggered(notification).then((triggered) => {
if (!triggered) { // Cancel the current notification in case it gets scheduled twice.
// Check if sound is enabled for notifications. return this.localNotifications.cancel(notification.id).finally(() => {
return this.configProvider.get(CoreConstants.SETTINGS_NOTIFICATION_SOUND, true).then((soundEnabled) => { if (!triggered) {
if (!soundEnabled) { // Check if sound is enabled for notifications.
notification.sound = null; return this.configProvider.get(CoreConstants.SETTINGS_NOTIFICATION_SOUND, true).then((soundEnabled) => {
} else { if (!soundEnabled) {
delete notification.sound; // Use default value. notification.sound = null;
} } else {
delete notification.sound; // Use default value.
}
// Remove from triggered, since the notification could be in there with a different time. // Remove from triggered, since the notification could be in there with a different time.
this.removeTriggered(notification.id); this.removeTriggered(notification.id);
this.localNotifications.cancel(notification.id).finally(() => {
this.localNotifications.schedule(notification); this.localNotifications.schedule(notification);
}); });
}); }
} });
}); });
} }