Skip to content

Commit 7fa8e6f

Browse files
committed
MOBILE-3323 editor: Delete draft when form is submitted
1 parent 5a79151 commit 7fa8e6f

File tree

58 files changed

+610
-156
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

58 files changed

+610
-156
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
</ion-refresher>
1010

1111
<core-loading [hideUntil]="loaded">
12-
<form ion-list [formGroup]="eventForm" *ngIf="!error">
12+
<form ion-list [formGroup]="eventForm" *ngIf="!error" #editEventForm>
1313
<!-- Event name. -->
1414
<ion-item text-wrap>
1515
<ion-label stacked><h2 [core-mark-required]="true">{{ 'addon.calendar.eventname' | translate }}</h2></ion-label>

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15-
import { Component, OnInit, OnDestroy, Optional, ViewChild } from '@angular/core';
15+
import { Component, OnInit, OnDestroy, Optional, ViewChild, ElementRef } from '@angular/core';
1616
import { FormControl, FormGroup, FormBuilder, Validators } from '@angular/forms';
1717
import { IonicPage, NavController, NavParams } from 'ionic-angular';
1818
import { TranslateService } from '@ngx-translate/core';
@@ -44,6 +44,7 @@ import { CoreFilterHelperProvider } from '@core/filter/providers/helper';
4444
export class AddonCalendarEditEventPage implements OnInit, OnDestroy {
4545

4646
@ViewChild(CoreEditorRichTextEditorComponent) descriptionEditor: CoreEditorRichTextEditorComponent;
47+
@ViewChild('editEventForm') formElement: ElementRef;
4748

4849
title: string;
4950
dateFormat: string;
@@ -496,6 +497,11 @@ export class AddonCalendarEditEventPage implements OnInit, OnDestroy {
496497
this.calendarProvider.submitEvent(this.eventId, data).then((result) => {
497498
event = result.event;
498499

500+
this.eventsProvider.trigger(CoreEventsProvider.FORM_SUBMITTED, {
501+
form: this.formElement.nativeElement,
502+
online: result.sent,
503+
}, this.currentSite.getId());
504+
499505
if (result.sent) {
500506
// Event created or edited, invalidate right days & months.
501507
const numberOfRepetitions = formData.repeat ? formData.repeats :

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
</ion-navbar>
1010
</ion-header>
1111
<ion-content>
12-
<form name="addon-mod_assign-edit-feedback-form" *ngIf="userId && plugin">
12+
<form name="addon-mod_assign-edit-feedback-form" *ngIf="userId && plugin" #editFeedbackForm>
1313
<addon-mod-assign-feedback-plugin [assign]="assign" [submission]="submission" [userId]="userId" [plugin]="plugin" [edit]="true"></addon-mod-assign-feedback-plugin>
1414
<button ion-button block (click)="done($event)">{{ 'core.done' | translate }}</button>
1515
</form>

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

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,11 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15-
import { Component, Input } from '@angular/core';
15+
import { Component, Input, ViewChild, ElementRef } from '@angular/core';
1616
import { IonicPage, ViewController, NavParams } from 'ionic-angular';
1717
import { TranslateService } from '@ngx-translate/core';
18+
import { CoreEventsProvider } from '@providers/events';
19+
import { CoreSitesProvider } from '@providers/sites';
1820
import { CoreDomUtilsProvider } from '@providers/utils/dom';
1921
import { AddonModAssignFeedbackDelegate } from '../../providers/feedback-delegate';
2022
import {
@@ -36,10 +38,17 @@ export class AddonModAssignEditFeedbackModalPage {
3638
@Input() plugin: AddonModAssignPlugin; // The plugin object.
3739
@Input() userId: number; // The user ID of the submission.
3840

41+
@ViewChild('editFeedbackForm') formElement: ElementRef;
42+
3943
protected forceLeave = false; // To allow leaving the page without checking for changes.
4044

41-
constructor(params: NavParams, protected viewCtrl: ViewController, protected domUtils: CoreDomUtilsProvider,
42-
protected translate: TranslateService, protected feedbackDelegate: AddonModAssignFeedbackDelegate) {
45+
constructor(params: NavParams,
46+
protected viewCtrl: ViewController,
47+
protected domUtils: CoreDomUtilsProvider,
48+
protected translate: TranslateService,
49+
protected feedbackDelegate: AddonModAssignFeedbackDelegate,
50+
protected eventsProvider: CoreEventsProvider,
51+
protected sitesProvider: CoreSitesProvider) {
4352

4453
this.assign = params.get('assign');
4554
this.submission = params.get('submission');
@@ -82,6 +91,11 @@ export class AddonModAssignEditFeedbackModalPage {
8291
e.preventDefault();
8392
e.stopPropagation();
8493

94+
this.eventsProvider.trigger(CoreEventsProvider.FORM_SUBMITTED, {
95+
form: this.formElement.nativeElement,
96+
online: false,
97+
}, this.sitesProvider.getCurrentSiteId());
98+
8599
// Close the modal, sending the input data.
86100
this.forceLeave = true;
87101
this.closeModal(this.getInputData());

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
<core-loading [hideUntil]="loaded">
1414
<ion-list>
1515
<!-- @todo: plagiarism_print_disclosure -->
16-
<form name="addon-mod_assign-edit-form" *ngIf="userSubmission && userSubmission.plugins && userSubmission.plugins.length">
16+
<form name="addon-mod_assign-edit-form" *ngIf="userSubmission && userSubmission.plugins && userSubmission.plugins.length" #editSubmissionForm>
1717
<!-- Submission statement. -->
1818
<ion-item text-wrap *ngIf="submissionStatement">
1919
<ion-label><core-format-text [text]="submissionStatement" [filter]="false"></core-format-text></ion-label>

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

Lines changed: 58 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15-
import { Component, OnInit, OnDestroy } from '@angular/core';
15+
import { Component, OnInit, OnDestroy, ViewChild, ElementRef } from '@angular/core';
1616
import { IonicPage, NavController, NavParams } from 'ionic-angular';
1717
import { TranslateService } from '@ngx-translate/core';
1818
import { CoreEventsProvider } from '@providers/events';
@@ -34,6 +34,9 @@ import { AddonModAssignHelperProvider } from '../../providers/helper';
3434
templateUrl: 'edit.html',
3535
})
3636
export class AddonModAssignEditPage implements OnInit, OnDestroy {
37+
38+
@ViewChild('editSubmissionForm') formElement: ElementRef;
39+
3740
title: string; // Title to display.
3841
assign: AddonModAssignAssign; // Assignment.
3942
courseId: number; // Course ID the assignment belongs to.
@@ -265,69 +268,77 @@ export class AddonModAssignEditPage implements OnInit, OnDestroy {
265268
*
266269
* @return Promise resolved when done.
267270
*/
268-
protected saveSubmission(): Promise<any> {
271+
protected async saveSubmission(): Promise<void> {
269272
const inputData = this.getInputData();
270273

271274
if (this.submissionStatement && (!inputData.submissionstatement || inputData.submissionstatement === 'false')) {
272-
return Promise.reject(this.translate.instant('addon.mod_assign.acceptsubmissionstatement'));
275+
throw this.translate.instant('addon.mod_assign.acceptsubmissionstatement');
273276
}
274277

275278
let modal = this.domUtils.showModalLoading();
279+
let size;
276280

277281
// Get size to ask for confirmation.
278-
return this.assignHelper.getSubmissionSizeForEdit(this.assign, this.userSubmission, inputData).catch(() => {
282+
try {
283+
size = await this.assignHelper.getSubmissionSizeForEdit(this.assign, this.userSubmission, inputData);
284+
} catch (error) {
279285
// Error calculating size, return -1.
280-
return -1;
281-
}).then((size) => {
282-
modal.dismiss();
286+
size = -1;
287+
}
288+
289+
modal.dismiss();
283290

291+
try {
284292
// Confirm action.
285-
return this.fileUploaderHelper.confirmUploadFile(size, true, this.allowOffline);
286-
}).then(() => {
293+
await this.fileUploaderHelper.confirmUploadFile(size, true, this.allowOffline);
294+
287295
modal = this.domUtils.showModalLoading('core.sending', true);
288296

289-
return this.prepareSubmissionData(inputData).then((pluginData) => {
290-
if (!Object.keys(pluginData).length) {
291-
// Nothing to save.
292-
return;
293-
}
297+
const pluginData = await this.prepareSubmissionData(inputData);
298+
if (!Object.keys(pluginData).length) {
299+
// Nothing to save.
300+
return;
301+
}
294302

295-
let promise;
303+
let sent: boolean;
296304

297-
if (this.saveOffline) {
298-
// Save submission in offline.
299-
promise = this.assignOfflineProvider.saveSubmission(this.assign.id, this.courseId, pluginData,
300-
this.userSubmission.timemodified, !this.assign.submissiondrafts, this.userId);
301-
} else {
302-
// Try to send it to server.
303-
promise = this.assignProvider.saveSubmission(this.assign.id, this.courseId, pluginData, this.allowOffline,
304-
this.userSubmission.timemodified, !!this.assign.submissiondrafts, this.userId);
305-
}
305+
if (this.saveOffline) {
306+
// Save submission in offline.
307+
sent = false;
308+
await this.assignOfflineProvider.saveSubmission(this.assign.id, this.courseId, pluginData,
309+
this.userSubmission.timemodified, !this.assign.submissiondrafts, this.userId);
310+
} else {
311+
// Try to send it to server.
312+
sent = await this.assignProvider.saveSubmission(this.assign.id, this.courseId, pluginData, this.allowOffline,
313+
this.userSubmission.timemodified, !!this.assign.submissiondrafts, this.userId);
314+
}
306315

307-
return promise.then(() => {
308-
// Clear temporary data from plugins.
309-
return this.assignHelper.clearSubmissionPluginTmpData(this.assign, this.userSubmission, inputData);
310-
}).then(() => {
311-
// Submission saved, trigger event.
312-
const params = {
313-
assignmentId: this.assign.id,
314-
submissionId: this.userSubmission.id,
315-
userId: this.userId,
316-
};
317-
318-
this.eventsProvider.trigger(AddonModAssignProvider.SUBMISSION_SAVED_EVENT, params,
319-
this.sitesProvider.getCurrentSiteId());
320-
321-
if (!this.assign.submissiondrafts) {
322-
// No drafts allowed, so it was submitted. Trigger event.
323-
this.eventsProvider.trigger(AddonModAssignProvider.SUBMITTED_FOR_GRADING_EVENT, params,
324-
this.sitesProvider.getCurrentSiteId());
325-
}
326-
});
327-
});
328-
}).finally(() => {
316+
// Clear temporary data from plugins.
317+
await this.assignHelper.clearSubmissionPluginTmpData(this.assign, this.userSubmission, inputData);
318+
319+
// Submission saved, trigger events.
320+
this.eventsProvider.trigger(CoreEventsProvider.FORM_SUBMITTED, {
321+
form: this.formElement.nativeElement,
322+
online: sent,
323+
}, this.sitesProvider.getCurrentSiteId());
324+
325+
const params = {
326+
assignmentId: this.assign.id,
327+
submissionId: this.userSubmission.id,
328+
userId: this.userId,
329+
};
330+
331+
this.eventsProvider.trigger(AddonModAssignProvider.SUBMISSION_SAVED_EVENT, params,
332+
this.sitesProvider.getCurrentSiteId());
333+
334+
if (!this.assign.submissiondrafts) {
335+
// No drafts allowed, so it was submitted. Trigger event.
336+
this.eventsProvider.trigger(AddonModAssignProvider.SUBMITTED_FOR_GRADING_EVENT, params,
337+
this.sitesProvider.getCurrentSiteId());
338+
}
339+
} finally {
329340
modal.dismiss();
330-
});
341+
}
331342
}
332343

333344
/**

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
<div class="addon-data-contents addon-data-entries-{{data.id}}" *ngIf="data">
2222
<core-style [css]="data.csstemplate" prefix=".addon-data-entries-{{data.id}}"></core-style>
2323

24-
<form (ngSubmit)="save($event)" [formGroup]="editForm">
24+
<form (ngSubmit)="save($event)" [formGroup]="editForm" #editFormEl>
2525
<core-compile-html [text]="editFormRender" [jsData]="jsData" [extraImports]="extraImports"></core-compile-html>
2626
</form>
2727
</div>

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15-
import { Component, ViewChild } from '@angular/core';
15+
import { Component, ViewChild, ElementRef } from '@angular/core';
1616
import { Content, IonicPage, NavParams, NavController } from 'ionic-angular';
1717
import { TranslateService } from '@ngx-translate/core';
1818
import { FormGroup } from '@angular/forms';
@@ -40,6 +40,7 @@ import { CoreTagProvider } from '@core/tag/providers/tag';
4040
})
4141
export class AddonModDataEditPage {
4242
@ViewChild(Content) content: Content;
43+
@ViewChild('editFormEl') formElement: ElementRef;
4344

4445
protected module: any;
4546
protected courseId: number;
@@ -216,6 +217,12 @@ export class AddonModDataEditPage {
216217

217218
// This is done if entry is updated when editing or creating if not.
218219
if ((this.entryId && result.updated) || (!this.entryId && result.newentryid)) {
220+
221+
this.eventsProvider.trigger(CoreEventsProvider.FORM_SUBMITTED, {
222+
form: this.formElement.nativeElement,
223+
online: result.sent,
224+
}, this.siteId);
225+
219226
const promises = [];
220227

221228
this.entryId = this.entryId || result.newentryid;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
<a class="tab-slide" [attr.aria-selected]="!search.searchingAdvanced" (click)="changeAdvanced(false)">{{ 'addon.mod_data.search' | translate}}</a>
1414
<a class="tab-slide" [attr.aria-selected]="search.searchingAdvanced" (click)="changeAdvanced(true)">{{ 'addon.mod_data.advancedsearch' | translate }}</a>
1515
</div>
16-
<form (ngSubmit)="searchEntries($event)" [formGroup]="searchForm">
16+
<form (ngSubmit)="searchEntries($event)" [formGroup]="searchForm" #searchFormEl>
1717
<ion-list no-margin>
1818
<ion-item [hidden]="search.searchingAdvanced">
1919
<ion-input type="text" placeholder="{{ 'addon.mod_data.search' | translate}}" [(ngModel)]="search.text" name="text" formControlName="text"></ion-input>

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

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,11 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15-
import { Component } from '@angular/core';
15+
import { Component, ViewChild, ElementRef } from '@angular/core';
1616
import { IonicPage, NavParams, ViewController } from 'ionic-angular';
1717
import { FormBuilder, FormGroup } from '@angular/forms';
18+
import { CoreEventsProvider } from '@providers/events';
19+
import { CoreSitesProvider } from '@providers/sites';
1820
import { CoreUtilsProvider } from '@providers/utils/utils';
1921
import { CoreDomUtilsProvider } from '@providers/utils/dom';
2022
import { CoreTextUtilsProvider } from '@providers/utils/text';
@@ -32,6 +34,8 @@ import { CoreTagProvider } from '@core/tag/providers/tag';
3234
templateUrl: 'search.html',
3335
})
3436
export class AddonModDataSearchPage {
37+
@ViewChild('searchFormEl') formElement: ElementRef;
38+
3539
search: any;
3640
fields: any;
3741
data: any;
@@ -41,10 +45,17 @@ export class AddonModDataSearchPage {
4145
jsData: any;
4246
fieldsArray: any;
4347

44-
constructor(params: NavParams, private viewCtrl: ViewController, fb: FormBuilder, protected utils: CoreUtilsProvider,
45-
protected domUtils: CoreDomUtilsProvider, protected fieldsDelegate: AddonModDataFieldsDelegate,
46-
protected textUtils: CoreTextUtilsProvider, protected dataHelper: AddonModDataHelperProvider,
47-
private tagProvider: CoreTagProvider) {
48+
constructor(params: NavParams,
49+
protected viewCtrl: ViewController,
50+
fb: FormBuilder,
51+
protected utils: CoreUtilsProvider,
52+
protected domUtils: CoreDomUtilsProvider,
53+
protected fieldsDelegate: AddonModDataFieldsDelegate,
54+
protected textUtils: CoreTextUtilsProvider,
55+
protected dataHelper: AddonModDataHelperProvider,
56+
protected tagProvider: CoreTagProvider,
57+
protected eventsProvider: CoreEventsProvider,
58+
protected sitesProvider: CoreSitesProvider) {
4859
this.search = params.get('search');
4960
this.fields = params.get('fields');
5061
this.data = params.get('data');
@@ -209,6 +220,11 @@ export class AddonModDataSearchPage {
209220
this.search.sortBy = searchedData.sortBy;
210221
this.search.sortDirection = searchedData.sortDirection;
211222

223+
this.eventsProvider.trigger(CoreEventsProvider.FORM_SUBMITTED, {
224+
form: this.formElement.nativeElement,
225+
online: false,
226+
}, this.sitesProvider.getCurrentSiteId());
227+
212228
this.closeModal(this.search);
213229
}
214230
}

0 commit comments

Comments
 (0)