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>
<ion-card list *ngIf="notificationsEnabled">
<ion-card list *ngIf="notificationsEnabled && event.timestart - 600 > currentTime">
<ion-item>
<ion-label>{{ 'addon.calendar.notifications' | translate }}</ion-label>
<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="10">{{ 600 | coreDuration }}</ion-option>
<ion-option value="30">{{ 1800 | coreDuration }}</ion-option>
<ion-option value="60">{{ 3600 | coreDuration }}</ion-option>
<ion-option value="120">{{ 7200 | coreDuration }}</ion-option>
<ion-option value="360">{{ 21600 | coreDuration }}</ion-option>
<ion-option value="720">{{ 43200 | coreDuration }}</ion-option>
<ion-option value="1440">{{ 86400 | coreDuration }}</ion-option>
<ion-option value="30" *ngIf="event.timestart - 1800 > currentTime">{{ 1800 | coreDuration }}</ion-option>
<ion-option value="60" *ngIf="event.timestart - 3600 > currentTime">{{ 3600 | coreDuration }}</ion-option>
<ion-option value="120" *ngIf="event.timestart - 7200 > currentTime">{{ 7200 | coreDuration }}</ion-option>
<ion-option value="360" *ngIf="event.timestart - 21600 > currentTime">{{ 21600 | coreDuration }}</ion-option>
<ion-option value="720" *ngIf="event.timestart - 43200 > currentTime">{{ 43200 | coreDuration }}</ion-option>
<ion-option value="1440" *ngIf="event.timestart - 86400 > currentTime">{{ 86400 | coreDuration }}</ion-option>
</ion-select>
</ion-item>
</ion-card>

View File

@ -48,12 +48,14 @@ export class AddonCalendarEventPage {
notificationsEnabled = false;
moduleUrl = '';
categoryPath = '';
currentTime: number;
defaultTime: number;
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,
localNotificationsProvider: CoreLocalNotificationsProvider, private courseProvider: CoreCourseProvider,
private textUtils: CoreTextUtilsProvider) {
private textUtils: CoreTextUtilsProvider, private timeUtils: CoreTimeUtilsProvider) {
this.eventId = navParams.get('id');
this.notificationsEnabled = localNotificationsProvider.isAvailable();
@ -61,9 +63,12 @@ export class AddonCalendarEventPage {
if (this.notificationsEnabled) {
this.calendarProvider.getEventNotificationTimeOption(this.eventId).then((notificationTime) => {
this.notificationTime = notificationTime;
this.loadNotificationTime();
});
this.calendarProvider.getDefaultNotificationTime().then((defaultTime) => {
this.defaultTime = defaultTime * 60;
this.loadNotificationTime();
if (defaultTime === 0) {
// Disabled by default.
this.defaultTimeReadable = this.translate.instant('core.settings.disabled');
@ -111,6 +116,9 @@ export class AddonCalendarEventPage {
this.calendarHelper.formatEventData(event);
this.event = event;
this.currentTime = this.timeUtils.timestamp();
this.loadNotificationTime();
// Reset some of the calculated data.
this.categoryPath = '';
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.
*

View File

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

View File

@ -10,8 +10,8 @@
</ion-header>
<ion-content>
<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)="toggleAdvanced()">{{ 'addon.mod_data.advancedsearch' | 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)="changeAdvanced(true)">{{ 'addon.mod_data.advancedsearch' | translate }}</a>
</div>
<form (ngSubmit)="searchEntries($event)" [formGroup]="searchForm">
<ion-list no-margin>

View File

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

View File

@ -57,7 +57,12 @@ export class AddonModUrlIndexComponent extends CoreCourseModuleMainResourceCompo
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 {
this.urlProvider.logView(this.module.instance).then(() => {
protected logView(): Promise<void> {
return this.urlProvider.logView(this.module.instance).then(() => {
this.courseProvider.checkModuleCompletion(this.courseId, this.module.completiondata);
}).catch(() => {
// Ignore errors.
});
}
/**
* Opens a file.
*/
go(): void {
this.logView();
this.urlHelper.open(this.url);
}
}

View File

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

View File

@ -297,6 +297,8 @@ export class CoreCourseFormatComponent implements OnInit, OnChanges, OnDestroy {
setTimeout(() => {
this.domUtils.scrollToElementBySelector(this.content, '#core-course-module-' + this.moduleId);
}, 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 {
if (changes.text) {
this.hideShowMore();
this.formatAndRenderContents();
}
}

View File

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