Skip to content

Commit 3ab2e7d

Browse files
committed
MOBILE-3323 editor: Discard draft when user cancels
1 parent 90f96b7 commit 3ab2e7d

File tree

29 files changed

+190
-215
lines changed

29 files changed

+190
-215
lines changed

src/addon/calendar/pages/edit-event/edit-event.ts

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -497,10 +497,7 @@ export class AddonCalendarEditEventPage implements OnInit, OnDestroy {
497497
this.calendarProvider.submitEvent(this.eventId, data).then((result) => {
498498
event = result.event;
499499

500-
this.eventsProvider.trigger(CoreEventsProvider.FORM_SUBMITTED, {
501-
form: this.formElement.nativeElement,
502-
online: result.sent,
503-
}, this.currentSite.getId());
500+
this.domUtils.triggerFormSubmittedEvent(this.formElement.nativeElement, result.sent, this.currentSite.getId());
504501

505502
if (result.sent) {
506503
// Event created or edited, invalidate right days & months.
@@ -563,6 +560,9 @@ export class AddonCalendarEditEventPage implements OnInit, OnDestroy {
563560
discard(): void {
564561
this.domUtils.showConfirm(this.translate.instant('core.areyousure')).then(() => {
565562
this.calendarOffline.deleteEvent(this.eventId).then(() => {
563+
564+
this.domUtils.triggerFormCancelledEvent(this.formElement.nativeElement, this.currentSite.getId());
565+
566566
this.returnToList();
567567
}).catch(() => {
568568
// Shouldn't happen.
@@ -578,16 +578,18 @@ export class AddonCalendarEditEventPage implements OnInit, OnDestroy {
578578
*
579579
* @return Resolved if we can leave it, rejected if not.
580580
*/
581-
ionViewCanLeave(): boolean | Promise<void> {
582-
581+
async ionViewCanLeave(): Promise<void> {
583582
if (this.calendarHelper.hasEventDataChanged(this.eventForm.value, this.originalData)) {
584583
// Show confirmation if some data has been modified.
585-
return this.domUtils.showConfirm(this.translate.instant('core.confirmcanceledit'));
586-
} else {
587-
return Promise.resolve();
584+
await this.domUtils.showConfirm(this.translate.instant('core.confirmcanceledit'));
588585
}
586+
587+
this.domUtils.triggerFormCancelledEvent(this.formElement.nativeElement, this.currentSite.getId());
589588
}
590589

590+
/**
591+
* Unblock sync.
592+
*/
591593
protected unblockSync(): void {
592594
if (this.eventId) {
593595
this.syncProvider.unblockOperation(AddonCalendarProvider.COMPONENT, this.eventId);

src/addon/mod/assign/pages/edit-feedback-modal/edit-feedback-modal.ts

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -61,16 +61,17 @@ export class AddonModAssignEditFeedbackModalPage {
6161
*
6262
* @return Resolved if we can leave it, rejected if not.
6363
*/
64-
ionViewCanLeave(): boolean | Promise<void> {
64+
async ionViewCanLeave(): Promise<void> {
6565
if (this.forceLeave) {
66-
return true;
66+
return;
6767
}
6868

69-
return this.hasDataChanged().then((changed) => {
70-
if (changed) {
71-
return this.domUtils.showConfirm(this.translate.instant('core.confirmcanceledit'));
72-
}
73-
});
69+
const changed = await this.hasDataChanged();
70+
if (changed) {
71+
await this.domUtils.showConfirm(this.translate.instant('core.confirmcanceledit'));
72+
}
73+
74+
this.domUtils.triggerFormCancelledEvent(this.formElement.nativeElement, this.sitesProvider.getCurrentSiteId());
7475
}
7576

7677
/**
@@ -91,10 +92,7 @@ export class AddonModAssignEditFeedbackModalPage {
9192
e.preventDefault();
9293
e.stopPropagation();
9394

94-
this.eventsProvider.trigger(CoreEventsProvider.FORM_SUBMITTED, {
95-
form: this.formElement.nativeElement,
96-
online: false,
97-
}, this.sitesProvider.getCurrentSiteId());
95+
this.domUtils.triggerFormSubmittedEvent(this.formElement.nativeElement, false, this.sitesProvider.getCurrentSiteId());
9896

9997
// Close the modal, sending the input data.
10098
this.forceLeave = true;

src/addon/mod/assign/pages/edit/edit.ts

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -85,20 +85,21 @@ export class AddonModAssignEditPage implements OnInit, OnDestroy {
8585
*
8686
* @return Resolved if we can leave it, rejected if not.
8787
*/
88-
ionViewCanLeave(): boolean | Promise<void> {
88+
async ionViewCanLeave(): Promise<void> {
8989
if (this.forceLeave) {
90-
return true;
90+
return;
9191
}
9292

9393
// Check if data has changed.
94-
return this.hasDataChanged().then((changed) => {
95-
if (changed) {
96-
return this.domUtils.showConfirm(this.translate.instant('core.confirmcanceledit'));
97-
}
98-
}).then(() => {
99-
// Nothing has changed or user confirmed to leave. Clear temporary data from plugins.
100-
this.assignHelper.clearSubmissionPluginTmpData(this.assign, this.userSubmission, this.getInputData());
101-
});
94+
const changed = await this.hasDataChanged();
95+
if (changed) {
96+
await this.domUtils.showConfirm(this.translate.instant('core.confirmcanceledit'));
97+
}
98+
99+
// Nothing has changed or user confirmed to leave. Clear temporary data from plugins.
100+
this.assignHelper.clearSubmissionPluginTmpData(this.assign, this.userSubmission, this.getInputData());
101+
102+
this.domUtils.triggerFormCancelledEvent(this.formElement.nativeElement, this.sitesProvider.getCurrentSiteId());
102103
}
103104

104105
/**
@@ -317,10 +318,7 @@ export class AddonModAssignEditPage implements OnInit, OnDestroy {
317318
await this.assignHelper.clearSubmissionPluginTmpData(this.assign, this.userSubmission, inputData);
318319

319320
// Submission saved, trigger events.
320-
this.eventsProvider.trigger(CoreEventsProvider.FORM_SUBMITTED, {
321-
form: this.formElement.nativeElement,
322-
online: sent,
323-
}, this.sitesProvider.getCurrentSiteId());
321+
this.domUtils.triggerFormSubmittedEvent(this.formElement.nativeElement, sent, this.sitesProvider.getCurrentSiteId());
324322

325323
const params = {
326324
assignmentId: this.assign.id,

src/addon/mod/data/pages/edit/edit.ts

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -96,28 +96,25 @@ export class AddonModDataEditPage {
9696
*
9797
* @return Resolved if we can leave it, rejected if not.
9898
*/
99-
ionViewCanLeave(): boolean | Promise<void> {
99+
async ionViewCanLeave(): Promise<void> {
100100
if (this.forceLeave || !this.entry) {
101-
return true;
101+
return;
102102
}
103103

104104
const inputData = this.editForm.value;
105105

106-
return this.dataHelper.hasEditDataChanged(inputData, this.fieldsArray, this.data.id,
107-
this.entry.contents).then((changed) => {
108-
if (!changed) {
109-
return Promise.resolve();
110-
}
106+
const changed = await this.dataHelper.hasEditDataChanged(inputData, this.fieldsArray, this.data.id, this.entry.contents);
111107

108+
if (changed) {
112109
// Show confirmation if some data has been modified.
113-
return this.domUtils.showConfirm(this.translate.instant('core.confirmcanceledit'));
114-
}).then(() => {
115-
// Delete the local files from the tmp folder.
116-
return this.dataHelper.getEditTmpFiles(inputData, this.fieldsArray, this.data.id,
117-
this.entry.contents).then((files) => {
118-
this.fileUploaderProvider.clearTmpFiles(files);
119-
});
120-
});
110+
await this.domUtils.showConfirm(this.translate.instant('core.confirmcanceledit'));
111+
}
112+
113+
// Delete the local files from the tmp folder.
114+
const files = await this.dataHelper.getEditTmpFiles(inputData, this.fieldsArray, this.data.id, this.entry.contents);
115+
this.fileUploaderProvider.clearTmpFiles(files);
116+
117+
this.domUtils.triggerFormCancelledEvent(this.formElement.nativeElement, this.siteId);
121118
}
122119

123120
/**
@@ -218,10 +215,7 @@ export class AddonModDataEditPage {
218215
// This is done if entry is updated when editing or creating if not.
219216
if ((this.entryId && result.updated) || (!this.entryId && result.newentryid)) {
220217

221-
this.eventsProvider.trigger(CoreEventsProvider.FORM_SUBMITTED, {
222-
form: this.formElement.nativeElement,
223-
online: result.sent,
224-
}, this.siteId);
218+
this.domUtils.triggerFormSubmittedEvent(this.formElement.nativeElement, result.sent, this.siteId);
225219

226220
const promises = [];
227221

src/addon/mod/data/pages/search/search.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,12 @@ export class AddonModDataSearchPage {
186186
* @param data Data to return to the page.
187187
*/
188188
closeModal(data?: any): void {
189+
if (typeof data == 'undefined') {
190+
this.domUtils.triggerFormCancelledEvent(this.formElement.nativeElement, this.sitesProvider.getCurrentSiteId());
191+
} else {
192+
this.domUtils.triggerFormSubmittedEvent(this.formElement.nativeElement, false, this.sitesProvider.getCurrentSiteId());
193+
}
194+
189195
this.viewCtrl.dismiss(data);
190196
}
191197

@@ -220,11 +226,6 @@ export class AddonModDataSearchPage {
220226
this.search.sortBy = searchedData.sortBy;
221227
this.search.sortDirection = searchedData.sortDirection;
222228

223-
this.eventsProvider.trigger(CoreEventsProvider.FORM_SUBMITTED, {
224-
form: this.formElement.nativeElement,
225-
online: false,
226-
}, this.sitesProvider.getCurrentSiteId());
227-
228229
this.closeModal(this.search);
229230
}
230231
}

src/addon/mod/lesson/components/index/index.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414

1515
import { Component, Optional, Injector, Input, ViewChild, ElementRef } from '@angular/core';
1616
import { Content, NavController } from 'ionic-angular';
17-
import { CoreEventsProvider } from '@providers/events';
1817
import { CoreGroupsProvider, CoreGroupInfo } from '@providers/groups';
1918
import { CoreTimeUtilsProvider } from '@providers/utils/time';
2019
import { CoreUtilsProvider } from '@providers/utils/utils';
@@ -587,10 +586,7 @@ export class AddonModLessonIndexComponent extends CoreCourseModuleMainActivityCo
587586
this.refreshIcon = 'refresh';
588587
this.syncIcon = 'sync';
589588

590-
this.eventsProvider.trigger(CoreEventsProvider.FORM_SUBMITTED, {
591-
form: this.formElement.nativeElement,
592-
online: true,
593-
}, this.siteId);
589+
this.domUtils.triggerFormSubmittedEvent(this.formElement.nativeElement, true, this.siteId);
594590
});
595591
}
596592

src/addon/mod/lesson/pages/password-modal/password-modal.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { Component, ViewChild, ElementRef } from '@angular/core';
1616
import { IonicPage, ViewController } from 'ionic-angular';
1717
import { CoreEventsProvider } from '@providers/events';
1818
import { CoreSitesProvider } from '@providers/sites';
19+
import { CoreDomUtilsProvider } from '@providers/utils/dom';
1920

2021
/**
2122
* Modal that asks the password for a lesson.
@@ -30,7 +31,8 @@ export class AddonModLessonPasswordModalPage {
3031

3132
constructor(protected viewCtrl: ViewController,
3233
protected eventsProvider: CoreEventsProvider,
33-
protected sitesProvider: CoreSitesProvider) { }
34+
protected sitesProvider: CoreSitesProvider,
35+
protected domUtils: CoreDomUtilsProvider) { }
3436

3537
/**
3638
* Send the password back.
@@ -42,10 +44,7 @@ export class AddonModLessonPasswordModalPage {
4244
e.preventDefault();
4345
e.stopPropagation();
4446

45-
this.eventsProvider.trigger(CoreEventsProvider.FORM_SUBMITTED, {
46-
form: this.formElement.nativeElement,
47-
online: false,
48-
}, this.sitesProvider.getCurrentSiteId());
47+
this.domUtils.triggerFormSubmittedEvent(this.formElement.nativeElement, false, this.sitesProvider.getCurrentSiteId());
4948

5049
this.viewCtrl.dismiss(password.value);
5150
}
@@ -54,6 +53,8 @@ export class AddonModLessonPasswordModalPage {
5453
* Close modal.
5554
*/
5655
closeModal(): void {
56+
this.domUtils.triggerFormCancelledEvent(this.formElement.nativeElement, this.sitesProvider.getCurrentSiteId());
57+
5758
this.viewCtrl.dismiss();
5859
}
5960
}

src/addon/mod/lesson/pages/player/player.ts

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -137,19 +137,19 @@ export class AddonModLessonPlayerPage implements OnInit, OnDestroy {
137137
*
138138
* @return Resolved if we can leave it, rejected if not.
139139
*/
140-
ionViewCanLeave(): boolean | Promise<void> {
140+
async ionViewCanLeave(): Promise<void> {
141141
if (this.forceLeave) {
142-
return true;
142+
return;
143143
}
144144

145145
if (this.question && !this.eolData && !this.processData && this.originalData) {
146146
// Question shown. Check if there is any change.
147147
if (!this.utils.basicLeftCompare(this.questionForm.getRawValue(), this.originalData, 3)) {
148-
return this.domUtils.showConfirm(this.translate.instant('core.confirmcanceledit'));
148+
await this.domUtils.showConfirm(this.translate.instant('core.confirmcanceledit'));
149149
}
150150
}
151151

152-
return Promise.resolve();
152+
this.domUtils.triggerFormCancelledEvent(this.formElement.nativeElement, this.sitesProvider.getCurrentSiteId());
153153
}
154154

155155
/**
@@ -552,10 +552,8 @@ export class AddonModLessonPlayerPage implements OnInit, OnDestroy {
552552

553553
return this.callFunction(this.lessonProvider.processPage.bind(this.lessonProvider), args, 6, 8).then((result) => {
554554
if (formSubmitted) {
555-
this.eventsProvider.trigger(CoreEventsProvider.FORM_SUBMITTED, {
556-
form: this.formElement.nativeElement,
557-
online: result.sent,
558-
}, this.sitesProvider.getCurrentSiteId());
555+
this.domUtils.triggerFormSubmittedEvent(this.formElement.nativeElement, result.sent,
556+
this.sitesProvider.getCurrentSiteId());
559557
}
560558

561559
if (!this.offline && !this.review && this.lessonProvider.isLessonOffline(this.lesson)) {

src/addon/mod/quiz/pages/player/player.ts

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -137,26 +137,28 @@ export class AddonModQuizPlayerPage implements OnInit, OnDestroy {
137137
*
138138
* @return Resolved if we can leave it, rejected if not.
139139
*/
140-
ionViewCanLeave(): boolean | Promise<void> {
140+
async ionViewCanLeave(): Promise<void> {
141141
if (this.forceLeave) {
142-
return true;
142+
return;
143143
}
144144

145145
if (this.questions && this.questions.length && !this.showSummary) {
146146
// Save answers.
147147
const modal = this.domUtils.showModalLoading('core.sending', true);
148148

149-
return this.processAttempt(false, false).catch(() => {
149+
try {
150+
await this.processAttempt(false, false);
151+
} catch (error) {
150152
// Save attempt failed. Show confirmation.
151153
modal.dismiss();
152154

153-
return this.domUtils.showConfirm(this.translate.instant('addon.mod_quiz.confirmleavequizonerror'));
154-
}).finally(() => {
155+
await this.domUtils.showConfirm(this.translate.instant('addon.mod_quiz.confirmleavequizonerror'));
156+
157+
this.domUtils.triggerFormCancelledEvent(this.formElement.nativeElement, this.sitesProvider.getCurrentSiteId());
158+
} finally {
155159
modal.dismiss();
156-
});
160+
}
157161
}
158-
159-
return Promise.resolve();
160162
}
161163

162164
/**
@@ -587,10 +589,8 @@ export class AddonModQuizPlayerPage implements OnInit, OnDestroy {
587589
this.autoSave.cancelAutoSave();
588590
this.autoSave.hideAutoSaveError();
589591

590-
this.eventsProvider.trigger(CoreEventsProvider.FORM_SUBMITTED, {
591-
form: this.formElement.nativeElement,
592-
online: !this.offline,
593-
}, this.sitesProvider.getCurrentSiteId());
592+
this.domUtils.triggerFormSubmittedEvent(this.formElement.nativeElement, !this.offline,
593+
this.sitesProvider.getCurrentSiteId());
594594
});
595595
}
596596

src/addon/mod/quiz/pages/preflight-modal/preflight-modal.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -120,10 +120,7 @@ export class AddonModQuizPreflightModalPage implements OnInit {
120120
this.domUtils.showErrorModal('core.errorinvalidform', true);
121121
}
122122
} else {
123-
this.eventsProvider.trigger(CoreEventsProvider.FORM_SUBMITTED, {
124-
form: this.formElement.nativeElement,
125-
online: false,
126-
}, this.siteId);
123+
this.domUtils.triggerFormSubmittedEvent(this.formElement.nativeElement, false, this.siteId);
127124

128125
this.viewCtrl.dismiss(this.preflightForm.value);
129126
}
@@ -133,6 +130,8 @@ export class AddonModQuizPreflightModalPage implements OnInit {
133130
* Close modal.
134131
*/
135132
closeModal(): void {
133+
this.domUtils.triggerFormCancelledEvent(this.formElement.nativeElement, this.siteId);
134+
136135
this.viewCtrl.dismiss();
137136
}
138137
}

0 commit comments

Comments
 (0)