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' ;
1616import { IonicPage , NavController , NavParams } from 'ionic-angular' ;
1717import { TranslateService } from '@ngx-translate/core' ;
1818import { CoreEventsProvider } from '@providers/events' ;
@@ -34,6 +34,9 @@ import { AddonModAssignHelperProvider } from '../../providers/helper';
3434 templateUrl : 'edit.html' ,
3535} )
3636export 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.
@@ -82,20 +85,21 @@ export class AddonModAssignEditPage implements OnInit, OnDestroy {
8285 *
8386 * @return Resolved if we can leave it, rejected if not.
8487 */
85- ionViewCanLeave ( ) : boolean | Promise < void > {
88+ async ionViewCanLeave ( ) : Promise < void > {
8689 if ( this . forceLeave ) {
87- return true ;
90+ return ;
8891 }
8992
9093 // Check if data has changed.
91- return this . hasDataChanged ( ) . then ( ( changed ) => {
92- if ( changed ) {
93- return this . domUtils . showConfirm ( this . translate . instant ( 'core.confirmcanceledit' ) ) ;
94- }
95- } ) . then ( ( ) => {
96- // Nothing has changed or user confirmed to leave. Clear temporary data from plugins.
97- this . assignHelper . clearSubmissionPluginTmpData ( this . assign , this . userSubmission , this . getInputData ( ) ) ;
98- } ) ;
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 ( ) ) ;
99103 }
100104
101105 /**
@@ -265,69 +269,74 @@ export class AddonModAssignEditPage implements OnInit, OnDestroy {
265269 *
266270 * @return Promise resolved when done.
267271 */
268- protected saveSubmission ( ) : Promise < any > {
272+ protected async saveSubmission ( ) : Promise < void > {
269273 const inputData = this . getInputData ( ) ;
270274
271275 if ( this . submissionStatement && ( ! inputData . submissionstatement || inputData . submissionstatement === 'false' ) ) {
272- return Promise . reject ( this . translate . instant ( 'addon.mod_assign.acceptsubmissionstatement' ) ) ;
276+ throw this . translate . instant ( 'addon.mod_assign.acceptsubmissionstatement' ) ;
273277 }
274278
275279 let modal = this . domUtils . showModalLoading ( ) ;
280+ let size ;
276281
277282 // Get size to ask for confirmation.
278- return this . assignHelper . getSubmissionSizeForEdit ( this . assign , this . userSubmission , inputData ) . catch ( ( ) => {
283+ try {
284+ size = await this . assignHelper . getSubmissionSizeForEdit ( this . assign , this . userSubmission , inputData ) ;
285+ } catch ( error ) {
279286 // Error calculating size, return -1.
280- return - 1 ;
281- } ) . then ( ( size ) => {
282- modal . dismiss ( ) ;
287+ size = - 1 ;
288+ }
289+
290+ modal . dismiss ( ) ;
283291
292+ try {
284293 // Confirm action.
285- return this . fileUploaderHelper . confirmUploadFile ( size , true , this . allowOffline ) ;
286- } ) . then ( ( ) => {
294+ await this . fileUploaderHelper . confirmUploadFile ( size , true , this . allowOffline ) ;
295+
287296 modal = this . domUtils . showModalLoading ( 'core.sending' , true ) ;
288297
289- return this . prepareSubmissionData ( inputData ) . then ( ( pluginData ) => {
290- if ( ! Object . keys ( pluginData ) . length ) {
291- // Nothing to save.
292- return ;
293- }
298+ const pluginData = await this . prepareSubmissionData ( inputData ) ;
299+ if ( ! Object . keys ( pluginData ) . length ) {
300+ // Nothing to save.
301+ return ;
302+ }
294303
295- let promise ;
304+ let sent : boolean ;
296305
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- }
306+ if ( this . saveOffline ) {
307+ // Save submission in offline.
308+ sent = false ;
309+ await this . assignOfflineProvider . saveSubmission ( this . assign . id , this . courseId , pluginData ,
310+ this . userSubmission . timemodified , ! this . assign . submissiondrafts , this . userId ) ;
311+ } else {
312+ // Try to send it to server.
313+ sent = await this . assignProvider . saveSubmission ( this . assign . id , this . courseId , pluginData , this . allowOffline ,
314+ this . userSubmission . timemodified , ! ! this . assign . submissiondrafts , this . userId ) ;
315+ }
306316
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 ( ( ) => {
317+ // Clear temporary data from plugins.
318+ await this . assignHelper . clearSubmissionPluginTmpData ( this . assign , this . userSubmission , inputData ) ;
319+
320+ // Submission saved, trigger events.
321+ this . domUtils . triggerFormSubmittedEvent ( this . formElement . nativeElement , sent , this . sitesProvider . getCurrentSiteId ( ) ) ;
322+
323+ const params = {
324+ assignmentId : this . assign . id ,
325+ submissionId : this . userSubmission . id ,
326+ userId : this . userId ,
327+ } ;
328+
329+ this . eventsProvider . trigger ( AddonModAssignProvider . SUBMISSION_SAVED_EVENT , params ,
330+ this . sitesProvider . getCurrentSiteId ( ) ) ;
331+
332+ if ( ! this . assign . submissiondrafts ) {
333+ // No drafts allowed, so it was submitted. Trigger event.
334+ this . eventsProvider . trigger ( AddonModAssignProvider . SUBMITTED_FOR_GRADING_EVENT , params ,
335+ this . sitesProvider . getCurrentSiteId ( ) ) ;
336+ }
337+ } finally {
329338 modal . dismiss ( ) ;
330- } ) ;
339+ }
331340 }
332341
333342 /**
0 commit comments