Merge pull request #3352 from dpalou/MOBILE-4116

Mobile 4116
main
Noel De Martin 2022-08-01 15:07:54 +02:00 committed by GitHub
commit 4e73abad9c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
31 changed files with 77 additions and 56 deletions

8
package-lock.json generated
View File

@ -23663,6 +23663,14 @@
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.2.tgz", "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.2.tgz",
"integrity": "sha512-UgzG4rvxYpN15jgCmVJwac49h9ly9NurikMWGPdVxm8GZD6XjkKPxDTjQQ43gtGgnV3X0cAyWDdP2Wexoquifg==" "integrity": "sha512-UgzG4rvxYpN15jgCmVJwac49h9ly9NurikMWGPdVxm8GZD6XjkKPxDTjQQ43gtGgnV3X0cAyWDdP2Wexoquifg=="
}, },
"moment-timezone": {
"version": "0.5.34",
"resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.34.tgz",
"integrity": "sha512-3zAEHh2hKUs3EXLESx/wsgw6IQdusOT8Bxm3D9UrHPQR7zlMmzwybC8zHEM1tQ4LJwP7fcxrWr8tuBg05fFCbg==",
"requires": {
"moment": ">= 2.9.0"
}
},
"move-concurrently": { "move-concurrently": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",

View File

@ -119,6 +119,7 @@
"jszip": "^3.7.1", "jszip": "^3.7.1",
"mathjax": "2.7.7", "mathjax": "2.7.7",
"moment": "^2.29.2", "moment": "^2.29.2",
"moment-timezone": "^0.5.34",
"nl.kingsquare.cordova.background-audio": "^1.0.1", "nl.kingsquare.cordova.background-audio": "^1.0.1",
"rxjs": "~6.5.5", "rxjs": "~6.5.5",
"ts-md5": "^1.2.7", "ts-md5": "^1.2.7",

View File

@ -22,7 +22,7 @@ import {
AddonCalendarGetActionEventsByTimesortWSParams, AddonCalendarGetActionEventsByTimesortWSParams,
AddonCalendarGetActionEventsByCoursesWSParams, AddonCalendarGetActionEventsByCoursesWSParams,
} from '@addons/calendar/services/calendar'; } from '@addons/calendar/services/calendar';
import moment from 'moment'; import moment from 'moment-timezone';
import { makeSingleton } from '@singletons'; import { makeSingleton } from '@singletons';
import { CoreSiteWSPreSets } from '@classes/site'; import { CoreSiteWSPreSets } from '@classes/site';

View File

@ -48,7 +48,7 @@ import {
CoreSwipeSlidesDynamicItemsManagerSource, CoreSwipeSlidesDynamicItemsManagerSource,
} from '@classes/items-management/swipe-slides-dynamic-items-manager-source'; } from '@classes/items-management/swipe-slides-dynamic-items-manager-source';
import { CoreSwipeSlidesDynamicItemsManager } from '@classes/items-management/swipe-slides-dynamic-items-manager'; import { CoreSwipeSlidesDynamicItemsManager } from '@classes/items-management/swipe-slides-dynamic-items-manager';
import moment from 'moment'; import moment from 'moment-timezone';
/** /**
* Component that displays a calendar. * Component that displays a calendar.
@ -509,7 +509,7 @@ class AddonCalendarMonthSlidesItemsManagerSource extends CoreSwipeSlidesDynamicI
const weekDays = AddonCalendar.getWeekDays(result.daynames[0].dayno); const weekDays = AddonCalendar.getWeekDays(result.daynames[0].dayno);
const weeks = result.weeks as AddonCalendarWeek[]; const weeks = result.weeks as AddonCalendarWeek[];
const currentDay = new Date().getDate(); const currentDay = moment().date();
const currentTime = CoreTimeUtils.timestamp(); const currentTime = CoreTimeUtils.timestamp();
const preloadedMonth: PreloadedMonth = { const preloadedMonth: PreloadedMonth = {

View File

@ -32,7 +32,7 @@ import { AddonCalendarSync, AddonCalendarSyncProvider } from '../../services/cal
import { CoreCategoryData, CoreCourses, CoreEnrolledCourseData } from '@features/courses/services/courses'; import { CoreCategoryData, CoreCourses, CoreEnrolledCourseData } from '@features/courses/services/courses';
import { CoreCoursesHelper } from '@features/courses/services/courses-helper'; import { CoreCoursesHelper } from '@features/courses/services/courses-helper';
import { AddonCalendarFilterComponent } from '../../components/filter/filter'; import { AddonCalendarFilterComponent } from '../../components/filter/filter';
import moment from 'moment'; import moment from 'moment-timezone';
import { NgZone } from '@singletons'; import { NgZone } from '@singletons';
import { CoreNavigator } from '@services/navigator'; import { CoreNavigator } from '@services/navigator';
import { Params } from '@angular/router'; import { Params } from '@angular/router';

View File

@ -31,7 +31,7 @@ import { CoreConfig } from '@services/config';
import { CoreUtils } from '@services/utils/utils'; import { CoreUtils } from '@services/utils/utils';
import { CoreCourse } from '@features/course/services/course'; import { CoreCourse } from '@features/course/services/course';
import { ContextLevel, CoreConstants } from '@/core/constants'; import { ContextLevel, CoreConstants } from '@/core/constants';
import moment from 'moment'; import moment from 'moment-timezone';
import { makeSingleton } from '@singletons'; import { makeSingleton } from '@singletons';
import { AddonCalendarSyncInvalidateEvent } from './calendar-sync'; import { AddonCalendarSyncInvalidateEvent } from './calendar-sync';
import { AddonCalendarOfflineEventDBRecord } from './database/calendar-offline'; import { AddonCalendarOfflineEventDBRecord } from './database/calendar-offline';
@ -136,8 +136,8 @@ export class AddonCalendarHelperProvider {
const result = {}; const result = {};
events.forEach((event) => { events.forEach((event) => {
const treatedDay = moment(new Date(event.timestart * 1000)); const treatedDay = moment(event.timestart * 1000);
const endDay = moment(new Date((event.timestart + event.timeduration) * 1000)); const endDay = moment((event.timestart + event.timeduration) * 1000);
// Add the event to all the days it lasts. // Add the event to all the days it lasts.
while (!treatedDay.isAfter(endDay, 'day')) { while (!treatedDay.isAfter(endDay, 'day')) {
@ -661,7 +661,7 @@ export class AddonCalendarHelperProvider {
// Fetch months and days. // Fetch months and days.
fetchTimestarts.map((fetchTime) => { fetchTimestarts.map((fetchTime) => {
const day = moment(new Date(fetchTime * 1000)); const day = moment(fetchTime * 1000);
const monthId = this.getMonthId(day); const monthId = this.getMonthId(day);
if (!treatedMonths[monthId]) { if (!treatedMonths[monthId]) {
@ -697,7 +697,7 @@ export class AddonCalendarHelperProvider {
// Invalidate months and days. // Invalidate months and days.
invalidateTimestarts.map((fetchTime) => { invalidateTimestarts.map((fetchTime) => {
const day = moment(new Date(fetchTime * 1000)); const day = moment(fetchTime * 1000);
const monthId = this.getMonthId(day); const monthId = this.getMonthId(day);
if (!treatedMonths[monthId]) { if (!treatedMonths[monthId]) {

View File

@ -29,7 +29,7 @@ import { AddonCalendarHelper } from './calendar-helper';
import { makeSingleton, Translate } from '@singletons'; import { makeSingleton, Translate } from '@singletons';
import { CoreSync } from '@services/sync'; import { CoreSync } from '@services/sync';
import { CoreNetworkError } from '@classes/errors/network-error'; import { CoreNetworkError } from '@classes/errors/network-error';
import moment from 'moment'; import moment from 'moment-timezone';
/** /**
* Service to sync calendar. * Service to sync calendar.

View File

@ -27,7 +27,7 @@ import { ILocalNotification } from '@ionic-native/local-notifications';
import { AddonCalendarOffline } from './calendar-offline'; import { AddonCalendarOffline } from './calendar-offline';
import { CoreUser } from '@features/user/services/user'; import { CoreUser } from '@features/user/services/user';
import { CoreWSExternalWarning, CoreWSDate } from '@services/ws'; import { CoreWSExternalWarning, CoreWSDate } from '@services/ws';
import moment from 'moment'; import moment from 'moment-timezone';
import { AddonCalendarEventDBRecord, AddonCalendarReminderDBRecord, EVENTS_TABLE, REMINDERS_TABLE } from './database/calendar'; import { AddonCalendarEventDBRecord, AddonCalendarReminderDBRecord, EVENTS_TABLE, REMINDERS_TABLE } from './database/calendar';
import { CoreCourses } from '@features/courses/services/courses'; import { CoreCourses } from '@features/courses/services/courses';
import { ContextLevel, CoreConstants } from '@/core/constants'; import { ContextLevel, CoreConstants } from '@/core/constants';

View File

@ -20,6 +20,7 @@ import { CoreContentLinksAction } from '@features/contentlinks/services/contentl
import { CoreNavigator } from '@services/navigator'; import { CoreNavigator } from '@services/navigator';
import { makeSingleton } from '@singletons'; import { makeSingleton } from '@singletons';
import { AddonCalendar } from '../calendar'; import { AddonCalendar } from '../calendar';
import moment from 'moment-timezone';
const SUPPORTED_VIEWS = ['month', 'mini', 'minithree', 'day', 'upcoming', 'upcoming_mini']; const SUPPORTED_VIEWS = ['month', 'mini', 'minithree', 'day', 'upcoming', 'upcoming_mini'];
@ -54,9 +55,9 @@ export class AddonCalendarViewLinkHandlerService extends CoreContentLinksHandler
}; };
const timestamp = params.time ? Number(params.time) * 1000 : Date.now(); const timestamp = params.time ? Number(params.time) * 1000 : Date.now();
const date = new Date(timestamp); const momentInstance = moment(timestamp);
stateParams.year = date.getFullYear(); stateParams.year = momentInstance.year();
stateParams.month = date.getMonth() + 1; stateParams.month = momentInstance.month() + 1;
CoreNavigator.navigateToSitePath('/calendar/index', { CoreNavigator.navigateToSitePath('/calendar/index', {
params: stateParams, params: stateParams,
@ -71,10 +72,10 @@ export class AddonCalendarViewLinkHandlerService extends CoreContentLinksHandler
}; };
const timestamp = params.time ? Number(params.time) * 1000 : Date.now(); const timestamp = params.time ? Number(params.time) * 1000 : Date.now();
const date = new Date(timestamp); const momentInstance = moment(timestamp);
stateParams.year = date.getFullYear(); stateParams.year = momentInstance.year();
stateParams.month = date.getMonth() + 1; stateParams.month = momentInstance.month() + 1;
stateParams.day = date.getDate(); stateParams.day = momentInstance.date();
CoreNavigator.navigateToSitePath('/calendar/day', { params: stateParams, siteId }); CoreNavigator.navigateToSitePath('/calendar/day', { params: stateParams, siteId });

View File

@ -36,7 +36,7 @@ import { CoreLogger } from '@singletons/logger';
import { CoreApp } from '@services/app'; import { CoreApp } from '@services/app';
import { CoreInfiniteLoadingComponent } from '@components/infinite-loading/infinite-loading'; import { CoreInfiniteLoadingComponent } from '@components/infinite-loading/infinite-loading';
import { Md5 } from 'ts-md5/dist/md5'; import { Md5 } from 'ts-md5/dist/md5';
import moment from 'moment'; import moment from 'moment-timezone';
import { CoreError } from '@classes/errors/error'; import { CoreError } from '@classes/errors/error';
import { Translate } from '@singletons'; import { Translate } from '@singletons';
import { CoreNavigator } from '@services/navigator'; import { CoreNavigator } from '@services/navigator';
@ -1125,7 +1125,7 @@ export class AddonMessagesDiscussionPage implements OnInit, OnDestroy, AfterView
useridfrom: this.currentUserId, useridfrom: this.currentUserId,
smallmessage: text, smallmessage: text,
text: text, text: text,
timecreated: new Date().getTime(), timecreated: Date.now(),
}; };
message.showDate = this.showDate(message, this.messages[this.messages.length - 1]); message.showDate = this.showDate(message, this.messages[this.messages.length - 1]);
this.addMessage(message, false); this.addMessage(message, false);

View File

@ -313,7 +313,7 @@ export class AddonMessagesOfflineProvider {
touserid: toUserId, touserid: toUserId,
useridfrom: site.getUserId(), useridfrom: site.getUserId(),
smallmessage: message, smallmessage: message,
timecreated: new Date().getTime(), timecreated: Date.now(),
deviceoffline: CoreNetwork.isOnline() ? 0 : 1, deviceoffline: CoreNetwork.isOnline() ? 0 : 1,
}; };

View File

@ -17,7 +17,7 @@ Feature: Test basic usage of assignment activity in app
| student1 | C1 | student | | student1 | C1 | student |
And the following "activities" exist: And the following "activities" exist:
| activity | course | idnumber | name | intro | assignsubmission_onlinetext_enabled | duedate | attemptreopenmethod | | activity | course | idnumber | name | intro | assignsubmission_onlinetext_enabled | duedate | attemptreopenmethod |
| assign | C1 | assign1 | assignment1 | Test assignment description1 | 1 | 1029844800 | manual | | assign | C1 | assign1 | assignment1 | Test assignment description1 | 1 | ## 20 August 2002 12:00 PM ## | manual |
Scenario: View assign description, due date & View list of student submissions (as teacher) & View own submission or student submission Scenario: View assign description, due date & View list of student submissions (as teacher) & View own submission or student submission
# Create, edit and submit as a student # Create, edit and submit as a student

View File

@ -17,7 +17,7 @@ Feature: Test basic usage of assignment activity in app
| student1 | C1 | student | | student1 | C1 | student |
And the following "activities" exist: And the following "activities" exist:
| activity | course | idnumber | name | intro | assignsubmission_onlinetext_enabled | duedate | attemptreopenmethod | | activity | course | idnumber | name | intro | assignsubmission_onlinetext_enabled | duedate | attemptreopenmethod |
| assign | C1 | assign1 | assignment1 | Test assignment description1 | 1 | 1029844800 | manual | | assign | C1 | assign1 | assignment1 | Test assignment description1 | 1 | ## 20 August 2002 12:00 PM ## | manual |
@lms_from3.11 @lms_from3.11
Scenario: View assign description, due date & View list of student submissions (as teacher) & View own submission or student submission Scenario: View assign description, due date & View list of student submissions (as teacher) & View own submission or student submission

View File

@ -14,7 +14,7 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { makeSingleton, Translate } from '@singletons'; import { makeSingleton, Translate } from '@singletons';
import * as moment from 'moment'; import moment from 'moment-timezone';
import { AddonModChatMessage, AddonModChatSessionMessage } from './chat'; import { AddonModChatMessage, AddonModChatSessionMessage } from './chat';
const patternTo = new RegExp(/^To\s([^:]+):(.*)/); const patternTo = new RegExp(/^To\s([^:]+):(.*)/);

View File

@ -15,6 +15,7 @@
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { CoreTimeUtils } from '@services/utils/time'; import { CoreTimeUtils } from '@services/utils/time';
import { Translate } from '@singletons'; import { Translate } from '@singletons';
import moment, { Moment } from 'moment-timezone';
import { AddonModDataFieldPluginBaseComponent } from '../../../classes/base-field-plugin-component'; import { AddonModDataFieldPluginBaseComponent } from '../../../classes/base-field-plugin-component';
/** /**
@ -43,7 +44,7 @@ export class AddonModDataFieldDateComponent extends AddonModDataFieldPluginBaseC
return; return;
} }
let date: Date; let momentInstance: Moment;
// Calculate format to use. // Calculate format to use.
this.format = CoreTimeUtils.fixFormatForDatetime(CoreTimeUtils.convertPHPToMoment( this.format = CoreTimeUtils.fixFormatForDatetime(CoreTimeUtils.convertPHPToMoment(
@ -55,27 +56,25 @@ export class AddonModDataFieldDateComponent extends AddonModDataFieldPluginBaseC
if (this.searchMode) { if (this.searchMode) {
this.addControl('f_' + this.field.id + '_z'); this.addControl('f_' + this.field.id + '_z');
date = this.searchFields!['f_' + this.field.id + '_y'] momentInstance = this.searchFields!['f_' + this.field.id + '_y']
? new Date(this.searchFields!['f_' + this.field.id + '_y'] + '-' + ? moment(this.searchFields!['f_' + this.field.id + '_y'] + '-' +
this.searchFields!['f_' + this.field.id + '_m'] + '-' + this.searchFields!['f_' + this.field.id + '_d']) this.searchFields!['f_' + this.field.id + '_m'] + '-' + this.searchFields!['f_' + this.field.id + '_d'])
: new Date(); : moment();
this.searchFields!['f_' + this.field.id] = CoreTimeUtils.toDatetimeFormat(date.getTime()); this.searchFields!['f_' + this.field.id] = CoreTimeUtils.toDatetimeFormat(momentInstance.unix() * 1000);
} else { } else {
date = this.value?.content momentInstance = this.value?.content
? new Date(parseInt(this.value.content, 10) * 1000) ? moment(parseInt(this.value.content, 10) * 1000)
: new Date(); : moment();
} }
const seconds = Math.floor(date.getTime() / 1000); this.addControl('f_' + this.field.id, CoreTimeUtils.toDatetimeFormat(momentInstance.unix() * 1000));
this.addControl('f_' + this.field.id, CoreTimeUtils.toDatetimeFormat(seconds * 1000));
if (!this.searchMode && !this.value?.content) { if (!this.searchMode && !this.value?.content) {
this.onFieldInit.emit({ this.onFieldInit.emit({
fieldid: this.field.id, fieldid: this.field.id,
content: String(seconds), content: String(momentInstance.unix()),
}); });
} }
} }

View File

@ -270,7 +270,7 @@ export class AddonModDataEditPage implements OnInit {
const modal = await CoreDomUtils.showModalLoading('core.sending', true); const modal = await CoreDomUtils.showModalLoading('core.sending', true);
// Create an ID to assign files. // Create an ID to assign files.
const entryTemp = this.entryId ? this.entryId : - (new Date().getTime()); const entryTemp = this.entryId ? this.entryId : - (Date.now());
let editData: AddonModDataEntryWSField[] = []; let editData: AddonModDataEntryWSField[] = [];
try { try {

View File

@ -262,7 +262,7 @@ export class AddonModDataOfflineProvider {
): Promise<AddonModDataEntryDBRecord> { ): Promise<AddonModDataEntryDBRecord> {
const site = await CoreSites.getSite(siteId); const site = await CoreSites.getSite(siteId);
timemodified = timemodified || new Date().getTime(); timemodified = timemodified || Date.now();
entryId = entryId === undefined || entryId === null ? -timemodified : entryId; entryId = entryId === undefined || entryId === null ? -timemodified : entryId;
const entry: AddonModDataEntryDBRecord = { const entry: AddonModDataEntryDBRecord = {

View File

@ -170,7 +170,7 @@ export class AddonModForumOfflineProvider {
options: JSON.stringify(options || {}), options: JSON.stringify(options || {}),
groupid: groupId || AddonModForumProvider.ALL_PARTICIPANTS, groupid: groupId || AddonModForumProvider.ALL_PARTICIPANTS,
userid: userId || site.getUserId(), userid: userId || site.getUserId(),
timecreated: timeCreated || new Date().getTime(), timecreated: timeCreated || Date.now(),
}; };
await site.getDb().insertRecord(DISCUSSIONS_TABLE, data); await site.getDb().insertRecord(DISCUSSIONS_TABLE, data);
@ -325,7 +325,7 @@ export class AddonModForumOfflineProvider {
message: message, message: message,
options: JSON.stringify(options || {}), options: JSON.stringify(options || {}),
userid: userId || site.getUserId(), userid: userId || site.getUserId(),
timecreated: new Date().getTime(), timecreated: Date.now(),
}; };
await site.getDb().insertRecord(REPLIES_TABLE, data); await site.getDb().insertRecord(REPLIES_TABLE, data);

View File

@ -137,7 +137,7 @@ export class AddonModSurveyOfflineProvider {
courseid: courseId, courseid: courseId,
userid: userId, userid: userId,
answers: JSON.stringify(answers), answers: JSON.stringify(answers),
timecreated: new Date().getTime(), timecreated: Date.now(),
}; };
await site.getDb().insertRecord(SURVEY_TABLE, entry); await site.getDb().insertRecord(SURVEY_TABLE, entry);

View File

@ -114,7 +114,7 @@ export class CoreUserAvatarComponent implements OnInit, OnChanges, OnDestroy {
if (this.user.lastaccess) { if (this.user.lastaccess) {
// If the time has passed, don't show the online status. // If the time has passed, don't show the online status.
const time = new Date().getTime() - this.timetoshowusers; const time = Date.now() - this.timetoshowusers;
return this.user.lastaccess * 1000 >= time; return this.user.lastaccess * 1000 >= time;
} else { } else {

View File

@ -40,7 +40,7 @@ import { CoreCommentsDBRecord } from '@features/comments/services/database/comme
import { CoreTimeUtils } from '@services/utils/time'; import { CoreTimeUtils } from '@services/utils/time';
import { CoreApp } from '@services/app'; import { CoreApp } from '@services/app';
import { CoreNetwork } from '@services/network'; import { CoreNetwork } from '@services/network';
import moment from 'moment'; import moment from 'moment-timezone';
import { Subscription } from 'rxjs'; import { Subscription } from 'rxjs';
import { CoreAnimations } from '@components/animations'; import { CoreAnimations } from '@components/animations';

View File

@ -72,7 +72,7 @@ import { DomSanitizer } from '@angular/platform-browser';
import { FormBuilder, Validators } from '@angular/forms'; import { FormBuilder, Validators } from '@angular/forms';
import { HttpClient } from '@angular/common/http'; import { HttpClient } from '@angular/common/http';
import { CoreConstants } from '@/core/constants'; import { CoreConstants } from '@/core/constants';
import moment from 'moment'; import moment from 'moment-timezone';
import { Md5 } from 'ts-md5/dist/md5'; import { Md5 } from 'ts-md5/dist/md5';
// Import core classes that can be useful for site plugins. // Import core classes that can be useful for site plugins.
@ -82,6 +82,7 @@ import { CoreComponentsRegistry } from '@singletons/components-registry';
import { CoreDom } from '@singletons/dom'; import { CoreDom } from '@singletons/dom';
import { CoreForms } from '@singletons/form'; import { CoreForms } from '@singletons/form';
import { CoreText } from '@singletons/text'; import { CoreText } from '@singletons/text';
import { CoreTime } from '@singletons/time';
import { CoreUrl } from '@singletons/url'; import { CoreUrl } from '@singletons/url';
import { CoreWindow } from '@singletons/window'; import { CoreWindow } from '@singletons/window';
import { CoreCache } from '@classes/cache'; import { CoreCache } from '@classes/cache';
@ -354,6 +355,7 @@ export class CoreCompileProvider {
instance['CoreDom'] = CoreDom; instance['CoreDom'] = CoreDom;
instance['CoreForms'] = CoreForms; instance['CoreForms'] = CoreForms;
instance['CoreText'] = CoreText; instance['CoreText'] = CoreText;
instance['CoreTime'] = CoreTime;
instance['CoreUrl'] = CoreUrl; instance['CoreUrl'] = CoreUrl;
instance['CoreWindow'] = CoreWindow; instance['CoreWindow'] = CoreWindow;
instance['CoreCache'] = CoreCache; instance['CoreCache'] = CoreCache;

View File

@ -14,7 +14,7 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { Params } from '@angular/router'; import { Params } from '@angular/router';
import moment from 'moment'; import moment from 'moment-timezone';
import { CoreSites, CoreSitesReadingStrategy } from '@services/sites'; import { CoreSites, CoreSitesReadingStrategy } from '@services/sites';
import { import {

View File

@ -1418,7 +1418,7 @@ export class CoreCourseProvider {
id: courseId, id: courseId,
status: status, status: status,
previous: previousStatus, previous: previousStatus,
updated: new Date().getTime(), updated: Date.now(),
downloadTime: downloadTime, downloadTime: downloadTime,
previousDownloadTime: previousDownloadTime, previousDownloadTime: previousDownloadTime,
}); });

View File

@ -25,7 +25,7 @@ import {
import { makeSingleton, Translate } from '@singletons'; import { makeSingleton, Translate } from '@singletons';
import { CoreWSExternalFile } from '@services/ws'; import { CoreWSExternalFile } from '@services/ws';
import { AddonCourseCompletion } from '@addons/coursecompletion/services/coursecompletion'; import { AddonCourseCompletion } from '@addons/coursecompletion/services/coursecompletion';
import moment from 'moment'; import moment from 'moment-timezone';
/** /**
* Helper to gather some common courses functions. * Helper to gather some common courses functions.

View File

@ -13,7 +13,7 @@
// limitations under the License. // limitations under the License.
import { Pipe, PipeTransform } from '@angular/core'; import { Pipe, PipeTransform } from '@angular/core';
import moment from 'moment'; import moment from 'moment-timezone';
import { CoreTimeUtils } from '@services/utils/time'; import { CoreTimeUtils } from '@services/utils/time';
import { Translate } from '@singletons'; import { Translate } from '@singletons';

View File

@ -15,7 +15,7 @@
import { Pipe, PipeTransform } from '@angular/core'; import { Pipe, PipeTransform } from '@angular/core';
import { Translate } from '@singletons'; import { Translate } from '@singletons';
import { CoreLogger } from '@singletons/logger'; import { CoreLogger } from '@singletons/logger';
import moment from 'moment'; import moment from 'moment-timezone';
/** /**
* Pipe to turn a UNIX timestamp to "time ago". * Pipe to turn a UNIX timestamp to "time ago".

View File

@ -21,7 +21,7 @@ import { CoreConfig } from '@services/config';
import { CoreSubscriptions } from '@singletons/subscriptions'; import { CoreSubscriptions } from '@singletons/subscriptions';
import { makeSingleton, Translate, Http } from '@singletons'; import { makeSingleton, Translate, Http } from '@singletons';
import * as moment from 'moment'; import moment from 'moment-timezone';
import { CoreSite } from '../classes/site'; import { CoreSite } from '../classes/site';
import { CorePlatform } from '@services/platform'; import { CorePlatform } from '@services/platform';

View File

@ -14,7 +14,7 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import moment, { LongDateFormatKey } from 'moment'; import moment, { LongDateFormatKey } from 'moment-timezone';
import { makeSingleton, Translate } from '@singletons'; import { makeSingleton, Translate } from '@singletons';
import { CoreTime } from '@singletons/time'; import { CoreTime } from '@singletons/time';

View File

@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
import moment from 'moment'; import moment from 'moment-timezone';
import { CoreConstants } from '@/core/constants'; import { CoreConstants } from '@/core/constants';

View File

@ -14,23 +14,33 @@
import { APP_INITIALIZER, NgModule } from '@angular/core'; import { APP_INITIALIZER, NgModule } from '@angular/core';
import { CoreAppProvider } from '@services/app'; import { CoreAppProvider } from '@services/app';
import moment from 'moment-timezone';
import { TestingBehatRuntime, TestingBehatRuntimeService } from './services/behat-runtime'; import { TestingBehatRuntime, TestingBehatRuntimeService } from './services/behat-runtime';
type AutomatedTestsWindow = Window & { type AutomatedTestsWindow = Window & {
behat?: TestingBehatRuntimeService; behat?: TestingBehatRuntimeService;
}; };
function initializeAutomatedTestsWindow(window: AutomatedTestsWindow) { function initializeAutomatedTests(window: AutomatedTestsWindow) {
if (!CoreAppProvider.isAutomated()) { if (!CoreAppProvider.isAutomated()) {
return; return;
} }
window.behat = TestingBehatRuntime.instance; window.behat = TestingBehatRuntime.instance;
// Force timezone for automated tests. Use the same timezone forced for LMS in tests.
moment.tz.setDefault('Australia/Perth');
} }
@NgModule({ @NgModule({
providers: [ providers: [
{ provide: APP_INITIALIZER, multi: true, useValue: () => initializeAutomatedTestsWindow(window) }, {
provide: APP_INITIALIZER,
multi: true,
useValue: () => {
initializeAutomatedTests(window);
},
},
], ],
}) })
export class TestingModule {} export class TestingModule {}