@@ -344,7 +344,7 @@ $(document).on('turbolinks:load', function () {
344344 var observeExportButtons = function ( ) {
345345 $ ( '.export-start' ) . on ( 'click' , function ( e ) {
346346 e . preventDefault ( ) ;
347- new bootstrap . Modal ( $ ( '#export -modal' ) ) . show ( ) ;
347+ new bootstrap . Modal ( $ ( '#transfer -modal' ) ) . show ( ) ;
348348 exportExerciseStart ( $ ( this ) . data ( ) . exerciseId ) ;
349349 } ) ;
350350 body_selector . on ( 'click' , '.export-retry-button' , function ( ) {
@@ -356,11 +356,11 @@ $(document).on('turbolinks:load', function () {
356356 }
357357
358358 var exportExerciseStart = function ( exerciseID ) {
359- const $exerciseDiv = $ ( '#export- exercise' ) ;
360- const $messageDiv = $exerciseDiv . children ( '.export -message' ) ;
361- const $actionsDiv = $exerciseDiv . children ( '.export -exercise-actions' ) ;
359+ const $exerciseDiv = $ ( '#exercise-transfer ' ) ;
360+ const $messageDiv = $exerciseDiv . children ( '.transfer -message' ) ;
361+ const $actionsDiv = $exerciseDiv . children ( '.transfer -exercise-actions' ) ;
362362
363- $messageDiv . removeClass ( 'export -failure' ) ;
363+ $messageDiv . removeClass ( 'transfer -failure' ) ;
364364
365365 $messageDiv . html ( I18n . t ( 'exercises.export_codeharbor.checking_codeharbor' ) ) ;
366366 $actionsDiv . html ( '<div class="spinner-border"></div>' ) ;
@@ -380,9 +380,9 @@ $(document).on('turbolinks:load', function () {
380380 } ;
381381
382382 var exportExerciseConfirm = function ( exerciseID ) {
383- const $exerciseDiv = $ ( '#export- exercise' ) ;
384- const $messageDiv = $exerciseDiv . children ( '.export -message' ) ;
385- const $actionsDiv = $exerciseDiv . children ( '.export -exercise-actions' ) ;
383+ const $exerciseDiv = $ ( '#exercise-transfer ' ) ;
384+ const $messageDiv = $exerciseDiv . children ( '.transfer -message' ) ;
385+ const $actionsDiv = $exerciseDiv . children ( '.transfer -exercise-actions' ) ;
386386
387387 return $ . ajax ( {
388388 type : 'POST' ,
@@ -395,11 +395,11 @@ $(document).on('turbolinks:load', function () {
395395 if ( response . status === 'success' ) {
396396 $messageDiv . addClass ( 'export-success' ) ;
397397 setTimeout ( ( function ( ) {
398- bootstrap . Modal . getInstance ( $ ( '#export -modal' ) ) ?. hide ( ) ;
398+ bootstrap . Modal . getInstance ( $ ( '#transfer -modal' ) ) ?. hide ( ) ;
399399 $messageDiv . html ( '' ) . removeClass ( 'export-success' ) ;
400400 } ) , 3000 ) ;
401401 } else {
402- $messageDiv . addClass ( 'export -failure' ) ;
402+ $messageDiv . addClass ( 'transfer -failure' ) ;
403403 }
404404 } ,
405405 error : function ( a , b , c ) {
@@ -408,6 +408,76 @@ $(document).on('turbolinks:load', function () {
408408 } ) ;
409409 } ;
410410
411+ var observeImportButtons = function ( ) {
412+ const $exerciseDiv = $ ( '#exercise-transfer' ) ;
413+ const $messageDiv = $exerciseDiv . children ( '.transfer-message' ) ;
414+ const $actionsDiv = $exerciseDiv . children ( '.transfer-exercise-actions' ) ;
415+
416+ $ ( '.import-start' ) . on ( 'click' , function ( e ) {
417+ e . preventDefault ( ) ;
418+ new bootstrap . Modal ( $ ( '#transfer-modal' ) ) . show ( ) ;
419+ importExerciseStart ( ) ;
420+ } ) ;
421+ body_selector . on ( 'change' , '#proforma-file' , async function ( ) {
422+ const file = event . target . files [ 0 ] ;
423+ const formData = new FormData ( ) ;
424+ formData . append ( 'file' , file ) ;
425+
426+ return $ . ajax ( {
427+ type : 'POST' ,
428+ url : Routes . import_start_exercises_path ( ) ,
429+ data : formData ,
430+ processData : false ,
431+ contentType : false ,
432+
433+ success : function ( response ) {
434+ $messageDiv . html ( response . message ) ;
435+ return $actionsDiv . html ( response . actions ) ;
436+ } ,
437+ error : function ( a , b , c ) {
438+ return alert ( `error: ${ c } ` ) ;
439+ }
440+ } ) ;
441+ } ) ;
442+ body_selector . on ( 'click' , '.import-action' , async function ( ) {
443+ let fileId = $ ( this ) . attr ( 'data-file-id' )
444+ let importType = $ ( this ) . attr ( 'data-import-type' )
445+ importExerciseConfirm ( fileId , importType )
446+ } ) ;
447+ }
448+ var importExerciseStart = function ( ) {
449+ // e.preventDefault();
450+ new bootstrap . Modal ( $ ( '#transfer-modal' ) ) . show ( ) ;
451+
452+ const $exerciseDiv = $ ( '#exercise-transfer' ) ;
453+ const $messageDiv = $exerciseDiv . children ( '.transfer-message' ) ;
454+ const $actionsDiv = $exerciseDiv . children ( '.transfer-exercise-actions' ) ;
455+
456+ $messageDiv . removeClass ( 'transfer-failure' ) ;
457+ $messageDiv . html ( I18n . t ( 'exercises.import_proforma.dialog.start' ) ) ;
458+ $actionsDiv . html ( '<label for="proforma-file">Upload file</label><input type="file" id="proforma-file" name="proforma-file">' ) ;
459+ }
460+
461+ var importExerciseConfirm = function ( fileId , importType ) {
462+ const $exerciseDiv = $ ( '#exercise-transfer' ) ;
463+ const $messageDiv = $exerciseDiv . children ( '.transfer-message' ) ;
464+ const $actionsDiv = $exerciseDiv . children ( '.transfer-exercise-actions' ) ;
465+
466+ $ . ajax ( {
467+ type : 'POST' ,
468+ url : Routes . import_confirm_exercises_path ( ) ,
469+ data : { file_id : fileId , import_type : importType } ,
470+ dataType : 'json' ,
471+
472+ success : function ( response ) {
473+ $messageDiv . html ( response . message ) ;
474+ return $actionsDiv . html ( response . actions ) ;
475+ } ,
476+ error : function ( a , b , c ) {
477+ return alert ( `error: ${ c } ` ) ;
478+ }
479+ } ) ;
480+ }
411481 var overrideTextareaTabBehavior = function ( ) {
412482 $ ( '.mb-3 textarea[name$="[content]"]' ) . on ( 'keydown' , function ( event ) {
413483 if ( event . which === TAB_KEY_CODE ) {
@@ -463,6 +533,7 @@ $(document).on('turbolinks:load', function () {
463533 if ( $ ( 'table:not(#tags-table)' ) . isPresent ( ) ) {
464534 enableBatchUpdate ( ) ;
465535 observeExportButtons ( ) ;
536+ observeImportButtons ( ) ;
466537 } else if ( $ ( '.edit_exercise, .new_exercise' ) . isPresent ( ) ) {
467538 const form_selector = $ ( 'form' ) ;
468539 execution_environments = form_selector . data ( 'execution-environments' ) ;
0 commit comments