From 02f321433210bf62bc05096faf35915ae57450a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= Date: Mon, 27 Apr 2020 14:42:47 +0200 Subject: [PATCH] MOBILE-3394 mod: Add event when user activity is sent --- src/addon/mod/assign/pages/edit/edit.ts | 4 ++++ src/addon/mod/chat/pages/chat/chat.ts | 1 + src/addon/mod/choice/components/index/index.ts | 16 +++++++++++++--- src/addon/mod/data/pages/edit/edit.ts | 4 ++++ src/addon/mod/feedback/pages/form/form.ts | 2 ++ .../forum/pages/new-discussion/new-discussion.ts | 2 ++ src/addon/mod/glossary/pages/edit/edit.ts | 1 + src/addon/mod/lesson/pages/player/player.ts | 5 +++-- src/addon/mod/quiz/pages/player/player.ts | 2 ++ src/addon/mod/scorm/pages/player/player.ts | 2 ++ src/addon/mod/survey/components/index/index.ts | 14 +++++++++++--- src/addon/mod/wiki/pages/edit/edit.ts | 2 ++ .../pages/edit-submission/edit-submission.ts | 2 ++ src/providers/events.ts | 1 + 14 files changed, 50 insertions(+), 8 deletions(-) diff --git a/src/addon/mod/assign/pages/edit/edit.ts b/src/addon/mod/assign/pages/edit/edit.ts index 87eb9ee29..33fcf85b8 100644 --- a/src/addon/mod/assign/pages/edit/edit.ts +++ b/src/addon/mod/assign/pages/edit/edit.ts @@ -317,6 +317,10 @@ export class AddonModAssignEditPage implements OnInit, OnDestroy { // Clear temporary data from plugins. await this.assignHelper.clearSubmissionPluginTmpData(this.assign, this.userSubmission, inputData); + if (sent) { + this.eventsProvider.trigger(CoreEventsProvider.ACTIVITY_DATA_SENT, { module: 'assign' }); + } + // Submission saved, trigger events. this.domUtils.triggerFormSubmittedEvent(this.formElement, sent, this.sitesProvider.getCurrentSiteId()); diff --git a/src/addon/mod/chat/pages/chat/chat.ts b/src/addon/mod/chat/pages/chat/chat.ts index bd34a6644..3130f397c 100644 --- a/src/addon/mod/chat/pages/chat/chat.ts +++ b/src/addon/mod/chat/pages/chat/chat.ts @@ -117,6 +117,7 @@ export class AddonModChatChatPage { * Runs when the page is about to leave and no longer be the active page. */ ionViewWillLeave(): void { + this.eventsProvider.trigger(CoreEventsProvider.ACTIVITY_DATA_SENT, { module: 'chat' }); this.stopPolling(); } diff --git a/src/addon/mod/choice/components/index/index.ts b/src/addon/mod/choice/components/index/index.ts index 6423f5439..2ce8f309b 100644 --- a/src/addon/mod/choice/components/index/index.ts +++ b/src/addon/mod/choice/components/index/index.ts @@ -14,6 +14,7 @@ import { Component, Optional, Injector } from '@angular/core'; import { Content } from 'ionic-angular'; +import { CoreEvents, CoreEventsProvider } from '@providers/events'; import { CoreTimeUtilsProvider } from '@providers/utils/time'; import { CoreCourseModuleMainActivityComponent } from '@core/course/classes/main-activity-component'; import { AddonModChoiceProvider, AddonModChoiceChoice, AddonModChoiceOption, AddonModChoiceResult } from '../../providers/choice'; @@ -51,9 +52,14 @@ export class AddonModChoiceIndexComponent extends CoreCourseModuleMainActivityCo protected hasAnsweredOnline = false; protected now: number; - constructor(injector: Injector, private choiceProvider: AddonModChoiceProvider, @Optional() content: Content, - private choiceOffline: AddonModChoiceOfflineProvider, private choiceSync: AddonModChoiceSyncProvider, - private timeUtils: CoreTimeUtilsProvider) { + constructor( + injector: Injector, + protected choiceProvider: AddonModChoiceProvider, + @Optional() content: Content, + protected choiceOffline: AddonModChoiceOfflineProvider, + protected choiceSync: AddonModChoiceSyncProvider, + protected timeUtils: CoreTimeUtilsProvider, + ) { super(injector, content); } @@ -359,6 +365,10 @@ export class AddonModChoiceIndexComponent extends CoreCourseModuleMainActivityCo this.courseProvider.checkModuleCompletion(this.courseId, this.module.completiondata); this.domUtils.scrollToTop(this.content); + if (online) { + CoreEvents.instance.trigger(CoreEventsProvider.ACTIVITY_DATA_SENT, { module: this.moduleName }); + } + return this.dataUpdated(online); }).catch((message) => { this.domUtils.showErrorModalDefault(message, 'addon.mod_choice.cannotsubmit', true); diff --git a/src/addon/mod/data/pages/edit/edit.ts b/src/addon/mod/data/pages/edit/edit.ts index a830e02d8..877785bbd 100644 --- a/src/addon/mod/data/pages/edit/edit.ts +++ b/src/addon/mod/data/pages/edit/edit.ts @@ -217,6 +217,10 @@ export class AddonModDataEditPage { this.domUtils.triggerFormSubmittedEvent(this.formElement, result.sent, this.siteId); + if (result.sent) { + this.eventsProvider.trigger(CoreEventsProvider.ACTIVITY_DATA_SENT, { module: 'data' }); + } + const promises = []; this.entryId = this.entryId || result.newentryid; diff --git a/src/addon/mod/feedback/pages/form/form.ts b/src/addon/mod/feedback/pages/form/form.ts index 3ee5f6ce9..8e136401a 100644 --- a/src/addon/mod/feedback/pages/form/form.ts +++ b/src/addon/mod/feedback/pages/form/form.ts @@ -280,6 +280,8 @@ export class AddonModFeedbackFormPage implements OnDestroy { promises.push(this.feedbackProvider.invalidateFeedbackAccessInformationData(this.feedback.id)); promises.push(this.feedbackProvider.invalidateResumePageData(this.feedback.id)); + this.eventsProvider.trigger(CoreEventsProvider.ACTIVITY_DATA_SENT, { module: 'feedback' }); + return Promise.all(promises).then(() => { return this.fetchAccessData(); }); diff --git a/src/addon/mod/forum/pages/new-discussion/new-discussion.ts b/src/addon/mod/forum/pages/new-discussion/new-discussion.ts index d9951cc49..17ff5888e 100644 --- a/src/addon/mod/forum/pages/new-discussion/new-discussion.ts +++ b/src/addon/mod/forum/pages/new-discussion/new-discussion.ts @@ -473,6 +473,8 @@ export class AddonModForumNewDiscussionPage implements OnDestroy { if (discussionIds) { // Data sent to server, delete stored files (if any). this.forumHelper.deleteNewDiscussionStoredFiles(this.forumId, discTimecreated); + + this.eventsProvider.trigger(CoreEventsProvider.ACTIVITY_DATA_SENT, { module: 'forum' }); } if (discussionIds && discussionIds.length < groupIds.length) { diff --git a/src/addon/mod/glossary/pages/edit/edit.ts b/src/addon/mod/glossary/pages/edit/edit.ts index 5bc201f8c..9bc2ee645 100644 --- a/src/addon/mod/glossary/pages/edit/edit.ts +++ b/src/addon/mod/glossary/pages/edit/edit.ts @@ -246,6 +246,7 @@ export class AddonModGlossaryEditPage implements OnInit { if (entryId) { // Data sent to server, delete stored files (if any). this.glossaryHelper.deleteStoredFiles(this.glossary.id, this.entry.concept, timecreated); + this.eventsProvider.trigger(CoreEventsProvider.ACTIVITY_DATA_SENT, { module: 'glossary' }); } const data = { diff --git a/src/addon/mod/lesson/pages/player/player.ts b/src/addon/mod/lesson/pages/player/player.ts index d8fa3b011..2b2c1753b 100644 --- a/src/addon/mod/lesson/pages/player/player.ts +++ b/src/addon/mod/lesson/pages/player/player.ts @@ -18,7 +18,6 @@ import { IonicPage, NavParams, Content, PopoverController, ModalController, Moda import { TranslateService } from '@ngx-translate/core'; import { CoreAppProvider } from '@providers/app'; import { CoreEventsProvider } from '@providers/events'; -import { CoreLoggerProvider } from '@providers/logger'; import { CoreSitesProvider } from '@providers/sites'; import { CoreSyncProvider } from '@providers/sync'; import { CoreDomUtilsProvider } from '@providers/utils/dom'; @@ -80,7 +79,7 @@ export class AddonModLessonPlayerPage implements OnInit, OnDestroy { protected loadingMenu: boolean; // Whether the lesson menu is being loaded. protected lessonPages: any[]; // Lesson pages (for the lesson menu). - constructor(protected navParams: NavParams, logger: CoreLoggerProvider, protected translate: TranslateService, + constructor(protected navParams: NavParams, protected translate: TranslateService, protected eventsProvider: CoreEventsProvider, protected sitesProvider: CoreSitesProvider, protected syncProvider: CoreSyncProvider, protected domUtils: CoreDomUtilsProvider, popoverCtrl: PopoverController, protected timeUtils: CoreTimeUtilsProvider, protected lessonProvider: AddonModLessonProvider, @@ -369,6 +368,8 @@ export class AddonModLessonPlayerPage implements OnInit, OnDestroy { this.messages = this.messages.concat(data.messages); this.processData = undefined; + this.eventsProvider.trigger(CoreEventsProvider.ACTIVITY_DATA_SENT, { module: 'lesson' }); + // Format activity link if present. if (this.eolData && this.eolData.activitylink) { this.eolData.activitylink.value = this.lessonHelper.formatActivityLink(this.eolData.activitylink.value); diff --git a/src/addon/mod/quiz/pages/player/player.ts b/src/addon/mod/quiz/pages/player/player.ts index 908918fbf..653a9b89a 100644 --- a/src/addon/mod/quiz/pages/player/player.ts +++ b/src/addon/mod/quiz/pages/player/player.ts @@ -376,6 +376,8 @@ export class AddonModQuizPlayerPage implements OnInit, OnDestroy { synced: !this.offline }, this.sitesProvider.getCurrentSiteId()); + this.eventsProvider.trigger(CoreEventsProvider.ACTIVITY_DATA_SENT, { module: 'quiz' }); + // Leave the player. this.forceLeave = true; this.navCtrl.pop(); diff --git a/src/addon/mod/scorm/pages/player/player.ts b/src/addon/mod/scorm/pages/player/player.ts index a7b507809..2b689387d 100644 --- a/src/addon/mod/scorm/pages/player/player.ts +++ b/src/addon/mod/scorm/pages/player/player.ts @@ -310,6 +310,8 @@ export class AddonModScormPlayerPage implements OnInit, OnDestroy { * Page will leave. */ ionViewWillUnload(): void { + this.eventsProvider.trigger(CoreEventsProvider.ACTIVITY_DATA_SENT, { module: 'scorm' }); + // Empty src when leaving the state so unload event is triggered in the iframe. this.src = ''; } diff --git a/src/addon/mod/survey/components/index/index.ts b/src/addon/mod/survey/components/index/index.ts index 633957845..b7e71e144 100644 --- a/src/addon/mod/survey/components/index/index.ts +++ b/src/addon/mod/survey/components/index/index.ts @@ -15,6 +15,7 @@ import { Component, Optional, Injector } from '@angular/core'; import { Content } from 'ionic-angular'; import { CoreCourseModuleMainActivityComponent } from '@core/course/classes/main-activity-component'; +import { CoreEvents, CoreEventsProvider } from '@providers/events'; import { AddonModSurveyProvider, AddonModSurveySurvey } from '../../providers/survey'; import { AddonModSurveyHelperProvider, AddonModSurveyQuestionFormatted } from '../../providers/helper'; import { AddonModSurveyOfflineProvider } from '../../providers/offline'; @@ -38,9 +39,14 @@ export class AddonModSurveyIndexComponent extends CoreCourseModuleMainActivityCo protected userId: number; protected syncEventName = AddonModSurveySyncProvider.AUTO_SYNCED; - constructor(injector: Injector, private surveyProvider: AddonModSurveyProvider, @Optional() content: Content, - private surveyHelper: AddonModSurveyHelperProvider, private surveyOffline: AddonModSurveyOfflineProvider, - private surveySync: AddonModSurveySyncProvider) { + constructor( + injector: Injector, + protected surveyProvider: AddonModSurveyProvider, + @Optional() content: Content, + protected surveyHelper: AddonModSurveyHelperProvider, + protected surveyOffline: AddonModSurveyOfflineProvider, + protected surveySync: AddonModSurveySyncProvider, + ) { super(injector, content); } @@ -185,6 +191,8 @@ export class AddonModSurveyIndexComponent extends CoreCourseModuleMainActivityCo } return this.surveyProvider.submitAnswers(this.survey.id, this.survey.name, this.courseId, answers).then((online) => { + CoreEvents.instance.trigger(CoreEventsProvider.ACTIVITY_DATA_SENT, { module: this.moduleName }); + if (online && this.isPrefetched()) { // The survey is downloaded, update the data. return this.surveySync.prefetchAfterUpdate(this.module, this.courseId).then(() => { diff --git a/src/addon/mod/wiki/pages/edit/edit.ts b/src/addon/mod/wiki/pages/edit/edit.ts index 01edf08ae..b0bf66db0 100644 --- a/src/addon/mod/wiki/pages/edit/edit.ts +++ b/src/addon/mod/wiki/pages/edit/edit.ts @@ -465,6 +465,8 @@ export class AddonModWikiEditPage implements OnInit, OnDestroy { this.domUtils.triggerFormSubmittedEvent(this.formElement, id > 0, this.sitesProvider.getCurrentSiteId()); if (id > 0) { + this.eventsProvider.trigger(CoreEventsProvider.ACTIVITY_DATA_SENT, { module: 'wiki' }); + // Page was created, get its data and go to the page. this.pageId = id; diff --git a/src/addon/mod/workshop/pages/edit-submission/edit-submission.ts b/src/addon/mod/workshop/pages/edit-submission/edit-submission.ts index 809419793..6d4f6d704 100644 --- a/src/addon/mod/workshop/pages/edit-submission/edit-submission.ts +++ b/src/addon/mod/workshop/pages/edit-submission/edit-submission.ts @@ -388,6 +388,8 @@ export class AddonModWorkshopEditSubmissionPage implements OnInit, OnDestroy { data['submissionId'] = newSubmissionId; } + this.eventsProvider.trigger(CoreEventsProvider.ACTIVITY_DATA_SENT, { module: 'workshop' }); + const promise = newSubmissionId ? this.workshopProvider.invalidateSubmissionData(this.workshopId, newSubmissionId) : Promise.resolve(); diff --git a/src/providers/events.ts b/src/providers/events.ts index a5e6e3bef..81493e9f6 100644 --- a/src/providers/events.ts +++ b/src/providers/events.ts @@ -67,6 +67,7 @@ export class CoreEventsProvider { static WS_CACHE_INVALIDATED = 'ws_cache_invalidated'; static SITE_STORAGE_DELETED = 'site_storage_deleted'; static FORM_ACTION = 'form_action'; + static ACTIVITY_DATA_SENT = 'activity_data_sent'; protected logger; protected observables: { [s: string]: Subject } = {};